2014-08-27 3 views
0

Я пытаюсь стандартизировать хаки в библиотеке, чтобы использовать JavaScript для настройки Enterprise Platform, очень сложной для написания кода на стороне клиента. В основном то, что я пытаюсь сделать, позволяет пользователю передавать ссылку на нужные им данные и независимо от того, как она хранится, я попытаюсь получить ее с помощью нескольких заранее определенных методов. Я знаю, что этот процесс не очень хорош, но нет никаких альтернатив тому, что мы пытаемся сделать.Объект или свойство не поддерживается

Я использую jQuery 1.6.2 и привязан к этому из-за зависимостей других библиотек.

Следующая строка:

if ($('input[id^=' + lineItemAttributeId + ']').length > 0) {

не дает следующее сообщение об ошибке: Объект не поддерживает это свойство или метод в IE8, но ни одна другая платформа.

Services.prototype.getAttributeValue = function(docNum, variableName, defaultValue) { 
    if (docNum == "1") { 
    var quoteItemAttributeId = variableName; 
    if ($('input[id*=' + quoteItemAttributeId + ']').length > 0) { 
     return $('input[id*=' + quoteItemAttributeId + ']').val(); 
    } else if ($('textarea[id*=' + quoteItemAttributeId + ']').length > 0) { 
     return $('textarea[id*=' + quoteItemAttributeId + ']').val(); 
    } else if ($('select[name*=' + quoteItemAttributeId + ']').length > 0) { 
     return $('select[name*=' + quoteItemAttributeId + ']').find("option:selected").val(); 
    } else { 
     return defaultValue; 
    } 
    } else { 
    var lineItemAttributeId = docNum + "_" + variableName; 
    if ($('input[id^=' + lineItemAttributeId + ']').length > 0) { 
     return $('input[id^=' + lineItemAttributeId + ']').val(); 
    } else if ($('textarea[id*=' + lineItemAttributeId + ']').length > 0) { 
     return $('textarea[id*=' + lineItemAttributeId + ']').val(); 
    } else if ($('select[name*=' + lineItemAttributeId + ']').length > 0) { 
     return $('select[name*=' + lineItemAttributeId + ']').find("option:selected").val(); 
    } else { 
     return defaultValue; 
    } 
    } 
}; 

Я попытался:

if ($('input[id=' + lineItemAttributeId + ']').length > 0) {

if ($('input[id*=' + lineItemAttributeId + ']').length > 0) {

с аналогичными результатами.

Любая идея о том, что я делаю неправильно?

+0

Какую версию jQuery вы используете? jQuery 2.x не поддерживает IE8 и ранее. Если вам нужно поддерживать старые браузеры, вы должны использовать jQuery 1.x. – Barmar

+0

Я бы попробовал 'if ($ ('input [id ="' + lineItemAttributeId + '"]'). Length> 0)' (обратите внимание на двойные кавычки, добавленные вокруг внутреннего аргумента). Это, как правило, самый безопасный способ использования селекторов атрибутов, чтобы избежать неожиданных или нежелательных странных символов из вызываемых выпусков – nbrooks

+0

Эта скрипка http://jsfiddle.net/barmar/1p1gjLgg/1/ работает для меня в IE8 – Barmar

ответ

1

В общем, самый безопасный способ использования селекторов атрибутов jQuery - обернуть внутренний аргумент в кавычки, особенно когда он может быть динамически оценен. Это объясняет проблемы, возникающие из-за пробелов, специальных символов или других странностей, которые могут привести к неправильной интерпретации вашего оператора jQuery. Согласно documentation, некотируемый формат работает (надежно) только для одиночных слов. Поэтому замените свой селектор атрибутов равным: $('input[id="' + lineItemAttributeId + '"]').length.

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