2010-01-18 1 views
2

Я тяну свои волосы! гррр ...JQuery: селекторная цепь с фильтром атрибутов: результат не сохраняется?

Это кажется работать:

//get all the foo and bar links that point to a named anchor: 
$("a.foo,a.bar").filter("[href^=#]").click 
(
    function() 
    { 
     doSomething($(this).attr("href").substr(1)); 
     return false; 
    } 
); 

Когда я вхожу выход. $ (это) .attr ("HREF") зиЬзЬг (1) 'в консоли I см. анкерное имя без хэша для всех соответствующих ссылок. Все хорошо. Но внутри doSomething(), typeof() говорит, что у меня есть строка, но она пуста! Зачем?!!

function doSomething(str) 
{ 
    //log str : it's empty!! 
} 

Обычно вскоре после того, как я отправляю вопрос здесь это слишком странно для тех, кто мне помочь или я понять свою собственную глупость позже. Надеюсь, кто-то может помочь на этот раз! :-(

============== решаемые =====================

* ******** Это была моя собственная глупость **********

внутри DoSomething первое, что мой код сделал:

if(str = "") return; 

(пощечины лоб). Спасибо всем, что заставило меня взглянуть на это по-другому.

ответ

1

I can't reproduce this. звучит как вопрос с самого doSomething кода - сделать быстрый обзор кода, чтобы убедиться, что вы направляете к правой функции и что вы не изменяя аргумент перед использованием ,

+0

omg ... спасибо про комментарий о «изменении аргумента» ... Мне так глупо. Я сделал «if (str =« ») return; можете ли вы определить проблему? Yah ... – rekindleMyLoveOf

-2

try substr(0) первый символ имеет индекс 0 http://www.w3schools.com/jsref/jsref_substr.asp

+0

Я думаю, что он намеренно пытается опустить #. – Matchu

+0

хорошо, я думаю, вы все равно должны принять то, что я думаю – antpaw

+0

... что это значит? xD Вход всегда приветствуется, но оценить вход и сказать, что это неправильно, не являются взаимоисключающими. – Matchu

0

Примечание: Это неправильный ответ! Но я собираюсь оставить его здесь, если он будет полезен другим пользователям Sizzle.


Это ошибка в Sizzle (библиотека селекторов, используемая jQuery).

Проблема в том, когда вы получаете доступ к link.href в JavaScript, вы не получаете текст атрибута href, вы получаете разрешенный абсолютный URL. Естественно, это начинается с http://, а не #.

Когда вы вызываете link.attr('href'), jQuery обнаруживает специальный случай и применяет обходное решение. Когда вы используете селектор, Sizzle этого не делает. Попытка:

attrHandle: { 
    href: function(elem){ 
     return elem.getAttribute("href"); 
    } 
}, 

, но этот способ не работает в IE до версии 7, так как они делают getAttribute равным просто получаю свойство JavaScript. [Правильный обходной путь будет использовать getAttributeNode вместо этого, или нюхать IE и использовать собственное getAttribute('href', 2) расширение.]

Так двигатель селектора получает http://... для HREF атрибута и, конечно, это не соответствует ^=#.

Если вы делаете это самостоятельно с помощью функции фильтра, он должен работать:

$('a.foo, a.bar').filter(function() { 
    return $(this).attr('href').substring(0, 1)==='#'; 
})... 
+0

Хм ... Я не слышал об этом раньше ... спасибо за информацию! – rekindleMyLoveOf

+0

А ... похоже, в этом случае все в порядке. У Sizzle есть эта ошибка, но текущие версии jQuery обезьяны - патч оскорбительной функции, чтобы исправить это! [Строка 2196 из jQuery 1.3.2.] – bobince

 Смежные вопросы

  • Нет связанных вопросов^_^