Как передать элемент HTML в качестве аргумента функции Javascript?

У меня есть окно чата с кнопкой закрытия (input type='image'), и я хочу удалить окно чата из родительского узла, и я использую этот код

closeBtn.setAttribute("onclick", "return closeContainer(cc" + friendId + ");");

обратите внимание, что эта кнопка создается с помощью javascipt и cc223423432 (скажем) будет идентификатором окна чата

вот мой код, чтобы удалить его

function closeContainer(ccId) {
    var x = ccId;
    x.parentNode.removeChild(x);
    //..........
}

теперь в IE8 и Chrome он находит переданный аргумент как HTMLDIV и работает нормально, но в Firefox он выдает ошибку. cc223423432 не определен.

я знаю, что всегда могу сделать document.getElementByID и затем удалить его, но, пожалуйста, если есть что-то, чего мне не хватает, пожалуйста, сообщите

4 ответа

Решение

closeBtn.setAttribute("onclick", "return closeContainer(cc" + friendId + ");");

Не используйте setAttribute для установки обработчиков событий... на самом деле вообще не используйте setAttribute в HTML-документе. В IE6-7 есть ошибки, влияющие на многие атрибуты, включая обработчики событий. Вместо этого всегда используйте свойства прямого атрибута 'DOM Level 2 HTML'; они надежны и облегчают чтение вашего кода.

Потеряйте попытку создать функцию из строки (это почти всегда неправильно) и просто напишите:

closeBtn.onclick= function() {
    return closeContainer(document.getElementById('cc'+friendId));
};

или даже просто включите функцию closeContainer:

closeBtn.onclick= function() {
    var el= document.getElementById('cc'+friendId);
    el.parentNode.removeChild(el);
    return false;
};

в firefox выдает ошибку cc223423432 не определена какая-либо идея почему???

Потому что IE делает каждый элемент с id (или в некоторых случаях name) глобальная переменная (свойство window). Так что в IE вы можете просто сказать cc223423432 и получить ссылку на ваш объект.

Это действительно плохая вещь, на которую можно положиться. Как и не существует в других браузерах, он загромождает глобальное пространство имен дерьмом и пойдет не так, как только у вас действительно будет переменная с тем же именем, что и id на твоей странице.

Используйте getElementById, чтобы получить ссылку на узел id'd, как указано выше. Это работает везде и однозначно.

Поскольку параметр не заключен в кавычки, Firefox рассматривает это как переменную с именем cc223423432, которая не определена. Вот почему он генерирует ошибку.

Лучше передать это как строку, а затем использовать

document.getElementById ( parameter );

чтобы получить объект.

Вам нужно передать этот идентификатор в виде строки:

closeBtn.setAttribute("onclick", "return closeContainer('cc" + friendId + "');");

Затем:

function closeContainer(ccId) {
    var x = document.getElementById(ccId);
    x.parentNode.removeChild(x);
    //..........
}

Или вы могли бы сделать следующее

function handler(elementRef) {
  console.log(elementRef);
}
<button onclick="handler(this)">Click Me!</button>

JQuery будет работать во всех этих браузерах. Я бы сделал следующее:

closeBtn.click(function(){
    ('#cc' + friendId ).remove();
});

Однако, если вы не хотите, чтобы время изучения API-интерфейса jquery увеличивалось, похоже, вам нужно передать параметр id в виде строки, в противном случае firefox считает это именем переменной (обратите внимание на дополнительные одинарные кавычки внутри вызова closeContainer:

closeBtn.setAttribute("onclick", "return closeContainer('cc" + friendId + "');");
Другие вопросы по тегам