У меня есть действительно странная проблема, что я надеюсь, что кто-то может пролить некоторый свет на. Я использую 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 все еще хорошо работает, но IE не делает.
Кто-либо видел это прежде или знает то, что продолжается здесь? Любая справка значительно ценится!
При доступе к свойству DOM href
элемента 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 ) {
// ...
}
Имя в элементе
здесь проверяет, не указано свойство DOM. Чтобы обойти это в IE8, вы можете указать свойство в верхнем регистре - .attr ("HREF")
- потому что свойства DOM чувствительны к регистру. К сожалению, единственный обходной путь для IE7 и ниже - выполнить замену строки:
var base = window.location.href.substring(0, window.location.href.lastIndexOf("/") + 1);
PageLink = PageLink.replace(base, "");
Это не проблема jquery, это является причудой ie. Это легко исправить " http: //myserver/pages/getThisPage.aspx? id = 8347 " .replace (' http: // myserver ', '').
Разные браузеры возвращают разные значения атрибутов 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];
Итак, вам нужен путь + запрос.
Проблема" заключается в том, что то, что вы видите в ваших HTML-источниках, не является тем, что jQuery "видит" в браузере DOM-Tree.
Это означает, что IE, скорее всего, просто сохраняет абсолютные URL внутри a-Nodes вашего DOM (в то время как другие браузеры этого не делают, но для браузера это не имеет значения, потому что он в любом случае может работать только с абсолютными URL, так что рано или поздно ему придется вычислять этот абсолютный URL).
Теперь jQuery просто возвращает значения, которые хранятся в DOM-дереве.
Если вы хотите проверить это, просто возьмите Firebug! Там вы можете просмотреть DOM (а с IE8 есть нечто подобное и в IE).