JQuery неправильно анализирует attr ("href") в IE - PullRequest
5 голосов
/ 26 февраля 2010

У меня действительно странная проблема, и я надеюсь, что кто-нибудь сможет пролить свет на это. Я использую Jquery для получения ответа Http с другого веб-сайта (которым я владею). Получив DOM, я анализирую его, чтобы получить определенную информацию. Однако когда я пытаюсь получить атрибут href ссылки, IE добавляет локальный домен в начало href!

Вот мой код:

$.ajax({ 
                    type: "POST",
                    url: "MyPage.aspx/GetWebResponse",
                    data: "http://myWebSite/pages/AnotherPage.aspx",
                    contentType: "application/json; charset=utf-8",
                    dataType: "json",
                    asynch: false,
                    success: function(data)
                    {
                        var __htmlForMainPage = data.d;                   


                        var PageLink = $(__htmlForMainPage).find("a:contains('Get This Link')").attr("href"); 
                                                }   
                });

Моя переменная PageLink ДОЛЖНА быть "/pages/getThisPage.aspx?id=8347". Тем не менее, он возвращается как "http://myserver/pages/getThisPage.aspx?id=8347".

Это происходит ТОЛЬКО в IE. FireFox в порядке. Это также происходит только тогда, когда я помещаю его на сервер. Когда я запускаю его локально, все работает нормально, как в IE, так и в FF. Но когда я ставлю его на сервер, FF по-прежнему работает нормально, а IE - нет.

Кто-нибудь видел это раньше или знает, что здесь происходит? Любая помощь с благодарностью!

Ответы [ 5 ]

9 голосов
/ 26 февраля 2010

При доступе к свойству href DOM элемента A в IE он возвращает абсолютный путь к URL-адресу. То же самое верно для getAttribute() в IE7 и ниже (поскольку getAttribute был сломан до IE8).

http://msdn.microsoft.com/en-us/library/cc848861(VS.85).aspx:

Internet Explorer 8 или более поздней версии. В режиме IE8 значение HREF зависит от контекста ссылки на атрибут. При чтении в качестве атрибута объектной модели документа (DOM) HREF возвращает URL-адрес относительно домена, на котором размещена веб-страница. HREF возвращает значение, указанное автором страницы, при чтении в качестве атрибута контента, когда страница отображается в более раннем режиме совместимости документов или когда страница просматривается в более ранней версии браузера. Для получения дополнительной информации см. Различия атрибутов в Internet Explorer 8.

jQuery всегда будет извлекать свойство DOM, если соглашение об именах одинаково:

// If applicable, access the attribute via the DOM 0 way
if ( name in elem && notxml && !special ) {
    // ...
}

Часть name in elem здесь проверяет, указано ли свойство DOM. Чтобы обойти это для IE8, вы можете указать свойство в верхнем регистре - .attr("HREF") - потому что свойства DOM чувствительны к регистру. К сожалению, единственный обходной путь для IE7 и ниже - выполнить замену строки:

var base = window.location.href.substring(0, window.location.href.lastIndexOf("/") + 1);
PageLink = PageLink.replace(base, ""); 
2 голосов
/ 26 февраля 2010

Это не проблема JQuery, это причуды ie. Это легко исправить "http://myserver/pages/getThisPage.aspx?id=8347".replace(' http://myserver', '').

1 голос
/ 26 февраля 2010

«Проблема» в том, что то, что вы видите в своих источниках HTML - это не то, что jQuery «видит» в браузерах DOM-Tree .

Это означает, что IE, скорее всего, просто сохраняет абсолютные URL-адреса внутри a-узлов вашей DOM (в то время как другие браузеры этого не делают, но это не очень важно для браузера, потому что он может работать с абсолютными URL только в любом случае, поэтому рано или поздно должен вычислить этот абсолютный URL).

Теперь jQuery просто возвращает значения, которые хранятся в DOM-дереве .

Если вы хотите это проверить, просто получите Firebug ! Вы можете просмотреть DOM там (и, поскольку в IE8 есть нечто похожее и в IE).

0 голосов
/ 05 октября 2011

Передайте второй атрибут функции getAttribute:

linkobj.getAttribute(‘href’,2);

Подробнее здесь - http://glennjones.net/2006/02/getattribute-href-bug/

0 голосов
/ 26 февраля 2010

Различные браузеры будут возвращать разные вещи для атрибутов URL. Нормализация URL - это ваша работа. Я использую регулярное выражение, как это:

var urlParts = /^(https?:\/\/.+?)?(\/.+?)(\?.*?)?$/.exec(href);
var server = urlParts[1]; // maybe be '' depending on the browser
var path = urlParts[2];
var query = urlParts[3];

Итак, вам нужен путь + запрос.

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