Присоединение событий к плоскому html-ответу ajax с помощью jquery - PullRequest
0 голосов
/ 06 августа 2010

В нашем приложении мы делаем ответ AJAX. Время от времени мы получаем ответ, который не полностью содержит Тест 3 в приведенном ниже коде. Несмотря на то, что можно заставить людей подчиняться, я хотел бы просто встроить в код пояс и подтяжки для обработки дела.

Ключом является функция findself (), которая предназначена для получения любого ответного html-блока через строку $ ('... html ...'), а затем применяет к нему соответствующую магию. Это работает просто найти в некоторых случаях, но в случае № 3 он умирает с ошибкой getAttribute в браузере.

Любые хорошие идеи о том, как расширить функцию findself () для обработки случая № 3?

var html;

function findself(sel, html) {
    return html.is(sel) ? html.find(sel).add(h) : html.find(sel);
}

html = $('<span rel="toggle">foo</span>');

findself('[rel="toggle"]', html).each(function () {
    console.log('ok 1');
});
console.log('done case 1');

findself('[rel="toggle"]', $('testing of a text node')).each(function () {
    console.log('ok 2');
});
console.log('done case 2');

html = $('<span>foo</span>some text<div rel="toggle">xx</div>');

findself('[rel="toggle"]', html).each(function () {
    console.log('ok 2');
});
console.log('done case 3');

1 Ответ

0 голосов
/ 06 августа 2010

Быстрая версия: Вы можете обойти вашу текущую проблему, убедившись, что текстовый элемент не находится между двумя и в корне, как это:

function findself(sel, html) {
    var h = $("<div />").append(html);
    return h.is(sel) ? h.find(sel).add(h) : h.find(sel);
}

Вы можете проверить это здесь .


Объяснение: Это ошибка в ядре jQuery, на которую она похожа. Он обнаруживает ее как строку HTML из-за открывающих / закрывающих тегов, но это не отдельный элемент. Это 3 узла, один из которых является текстом, из-за этого неправильного обнаружения он неправильно обрабатывает его как строку элемента, а не как коллекцию дочерних элементов, например:

jQuery.filter('[rel="t"]', $('<span>foo</span>some text'));            //works
jQuery.filter('[rel="t"]', $('<div><span>foo</span>some text</div>')); //works
jQuery.filter('[rel="t"]', $('<span>foo</span>text<div>xx</div>'));    //fails

Так что в настоящее время jquery.filter() (который используется .is()) не работает с текстовым узлом в середине.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...