JQuery: цепочка селекторов с атрибутным фильтром: результат не сохраняется? - PullRequest
2 голосов
/ 18 января 2010

Я вырываю волосы !! гррр ...

Это кажется для работы:

//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;
    }
);

Когда я записываю вывод '$ (this) .attr ("href"). Substr (1) "на консоль, я вижу якорное имя без хеша для всех соответствующих ссылок. Все хорошо. Но внутри doSomething () typeof () of говорит, что у меня есть строка - но она пуста !! Почему? !!

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

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

============== решено ====================

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

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

if(str = "") return;

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

Ответы [ 3 ]

1 голос
/ 18 января 2010

Я не могу воспроизвести это. Звучит как проблема с самим кодом doSomething - сделайте быстрый обзор кода, чтобы убедиться, что вы указываете на нужную функцию, а неизменение аргумента перед использованием.

0 голосов
/ 19 января 2010

примечание: это не правильный ответ! Но я оставлю это здесь на случай, если он будет полезен другим пользователям 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 голосов
/ 18 января 2010

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

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