Я пытаюсь добавить новый якорь с помощью кода ниже. Функция addButton отлично работает и добавляет соответствующий элемент в соответствующее место.
Однако этот элемент не является "активным". В частности, я не могу щелкнуть по нему, как я могу других.
Почему это так? Я думал, потому что я добавил через $ (document).on("click"...) он автоматически добавляется в DOM? (Указатель даже меняет значок, чтобы указать кнопку!)
$(document).on("click", "#addFavorite-button", function(){addButton();});
function addButton(){
var uid = $("#main_container").attr("uid");
var ticker = $("#main_container").attr("ticker");
var exchange = $("#main_container").attr("exchange");
var mydiv = document.getElementById("buttonlist");
var aTag = document.createElement('a');
aTag.setAttribute('class',"button widget d-margins stockButton");
aTag.setAttribute('uid',uid);
aTag.setAttribute('exchange',exchange);
aTag.setAttribute('ticker',ticker);
aTag.setAttribute('data-uib',"app_framework/button");
aTag.setAttribute('data-ver',"0");
aTag.setAttribute('id',ticker+"-"+exchange+"-button");
aTag.innerHTML = ticker;
mydiv.appendChild(aTag);
};
Изменить: Слишком большое, чтобы добавить к скрипке, но я загрузил рабочую версию здесь:
Чтобы увидеть, как это работает, введите "FB", нажмите "go". Затем нажмите "Добавить товар в избранное" и "сделайте", затем нажмите кнопку "Избранное". Вы увидите вариант FB. Однако, если вы нажмете любой другой запас, например, MSFT, вы не сможете нажать и вернуться к FB снова. Текст в середине не меняется.
в файле index_user_scripts.js заменить следующие строки сценария:
замещать
$(".stockButton").click(function(evt){
uib_sb.toggle_sidebar($("#leftPanel"));
setView($(this).attr("uid"),$(this).attr("ticker"), $(this).attr("exchange"));
});
(Обновление) С
$('#buttonlist').on('click','.stockButton',function(evt){
uib_sb.toggle_sidebar($("#leftPanel"));
setView($(this).attr("uid"),$(this).attr("ticker"), $(this).attr("exchange"));
});
объяснение
Первый скрипт делегирует событие всем элементам, имеющим селектор ".stockButton", которые в настоящее время находятся в DOM. он не работает для динамически добавленных элементов.
Сценарий Later поддерживает делегирование событий динамически добавленным дочерним элементам. НЕ всегда рекомендуется делегировать события через " документ ".
Предпочтительно вы должны делегировать событие через ближайший родительский элемент дочернего элемента.
Как вы можете видеть сценарий, упомянутый в ответе Джека
$('#buttonlist').on('click', '.stockButton', function(event) {
// your click handler here
});
в сценарии выше #buttonlist является ближайшим родителем всей дочерней кнопки (любимые кнопки)
Здесь ссылка на .on() в случае, если вы захотите посмотреть.
Вы уже используете jQuery, так что вы можете заставить его работать на вас:
$('<a>', {
"class": "button widget d-margins stockButton",
"id": ticket + "-" + exchange + "-button",
"href": "#", // you will need this in some browsers
"uid": uid, // invalid attribute
"exchange": exchange, // invalid attribute
"ticket": ticket // invalid attribute
})
.data({
"uib": "app_framework/button",
"ver": 0
});
.appendTo('#buttonlist');
Для выполнения этой работы вам также необходимо настроить делегированный обработчик #buttonlist
который является ближайшим элементом DOM, который, скорее всего, не будет удален:
$('#buttonlist').on('click', '.stockButton', function(event) {
// your click handler here
});
И удалите существующие $('stockButton').click(...)
.
Я также добавил атрибут href
; некоторые браузеры не любят якоря без него.
Обратите внимание: uid
, exchange
и ticket
не являются действительными атрибутами для элемента, поэтому я бы предложил использовать .data()
для них.
document
, потому что JQuery код будет вызываться на все клики на странице, но вы действительно только хотите иметь код , выполняемый при нажатии внутри #buttonlist
кнопки.