IE7 проблемы с моим JQuery [нажмите и измените функции] - PullRequest
2 голосов
/ 15 сентября 2010

У меня есть следующие фрагменты кода.По сути, я пытаюсь сделать это с помощью функции первого щелчка, которая перебирает все кэшированные данные JSON и отображает любые значения, существующие для этого идентификатора.Во 2-й функции изменения я записываю всякий раз, когда один из элементов изменяет значения (т. Е. Да на нет и наоборот).

Все эти элементы генерируются динамически, хотя данные JSON я получаю от веб-службы.Из моего понимания, поэтому я должен использовать функциональность .live.

В Firefox все работает как положено (конечно).Однако в IE7 это не так.В IE7, если я выберу переключатель, который отображает предупреждение от функции щелчка, то он также добавляет в массив для измененной функции.Однако, если переключатель не делает ничего из функции щелчка, массив не добавляется для изменения.

Когда я смотрю на этот код, я думаю, что смогу объединить эти две функции вместе, однако сейчас я просто хочу, чтобы он работал в IE7.

$(document).ready(function () {
    //This function is run whenever a 'radio button' is selected.
    //It then goes into the CPItemMetaInfoList in the cached JSON data
    //($.myglobals) and checks to see if there are currently any 
    //scripts to display.

$("input:radio").live("click", function () {
    var index = parseInt(this.name.split(':')[0]);
    for (i = 0; i <= $.myglobals.result.length - 1; i++) {
        if ($.myglobals.result[i].CPItemMetaInfoList.length > 0) {
           for (j = 0; j <= $.myglobals.result[i].CPItemMetaInfoList.length - 1; j++) {
                if (index == $.myglobals.result[i].QuestionId) {
                    alert($.myglobals.result[i].CPItemMetaInfoList[j].KeyStringValue);
                    return;
                }
            }
        }
    }
});
});

$(document).ready(function () {
    var blnCheck = false;
    //Checks to see if values have changed.
    //If a value has been changed then the isDirty array gets populated.
    //This array is used when the questionSubmit button is clickeds
    $('input').live('change', function () {
        blnCheck = false;

        for (i = 0; i <= isDirty.length - 1; i++) {
            if (isDirty[i] == $(this).attr("name")) {
                blnCheck = true;
                break
            }
        }


    if (blnCheck == false) {
        isDirty[arrayCount] = $(this).attr("name");
        arrayCount += 1;
        alert($(this).attr("name"));
    }
});

$('textarea').live('change', function () {
    blnCheck = false;
    for (i = 0; i <= isDirty.length - 1; i++) {
        if (isDirty[i] == $(this).attr("id")) {
            blnCheck = true;
            break
        }
    }

    if (blnCheck == false) {
        isDirty[arrayCount] = $(this).attr("id");
        arrayCount += 1;
        //alert($(this).attr("name"));
    }
});
});

ОБНОВЛЕНИЕ:

Мне пришлось переместить этот кусок кода в функцию щелчка:

   blnCheck = false;
   for (i = 0; i <= isDirty.length - 1; i++) {
        if (isDirty[i] == $(this).attr("name")) {
            blnCheck = true;
            break
        }
    }


    if (blnCheck == false) {
        isDirty[arrayCount] = $(this).attr("name");
        arrayCount += 1;
        alert($(this).attr("name"));
    }

Как это:

     $(document).ready(function () {
     //This function is run whenever a 'radio button' is selected.
     //It then goes into the CPItemMetaInfoList in the cached JSON data
     //($.myglobals) and checks to see if there are currently any 
     //scripts to display.

     $("input:radio").live("click", function () {
         var index = parseInt(this.name.split(':')[0]);
         for (i = 0; i <= $.myglobals.result.length - 1; i++) {
             if ($.myglobals.result[i].CPItemMetaInfoList.length > 0) {
                for (j = 0; j <= $.myglobals.result[i].CPItemMetaInfoList.length - 1; j++) {
                     if (index == $.myglobals.result[i].QuestionId) {
                         alert($.myglobals.result[i].CPItemMetaInfoList[j].KeyStringValue);
                         return;
                     }
                 }
             }
         }
         blnCheck = false;

         for (i = 0; i <= isDirty.length - 1; i++) {
             if (isDirty[i] == $(this).attr("name")) {
                 blnCheck = true;
                 break
             }
         }

      if (blnCheck == false) {
          isDirty[arrayCount] = $(this).attr("name");
          arrayCount += 1;
      }

     });
});

Но ...

Мне пришлось оставить функцию изменения такой же.Из моего тестирования я обнаружил, что функция .click работала для IE7 для переключателей и элементов флажков, но функциональность .change работала для текстовых полей и текстовых областей в IE7 и FF, а также для исходной функциональности переключателей и элементов флажков.

Этот стал очень грязным.Спасибо @Patricia за просмотр.Здесь предложения действительно привели меня к этому решению.Я оставлю вопрос без ответа, так как думаю, что нет более чистого решения для этого.

Ответы [ 3 ]

2 голосов
/ 21 сентября 2010

Факт: событие change на переключателях и флажках запускается только в случае потери focus (т. Е. Когда должно произойти событие blur). Чтобы достичь «ожидаемого» поведения, вы действительно хотите подключить событие click.

Вы в основном хотите изменить

$('input').live('change', function() {
    // Code.
});

до

$('input:radio').live('click', functionName);
$('input:not(:radio)').live('change', functionName);

function functionName() {
    // Code.
}

(однако я бы также принял во внимание флажки, используя селектор :checkbox для случая, когда у вас есть какой-либо в вашей форме, вы хотели бы относиться к ним как к радиокнопкам)

1 голос
/ 15 сентября 2010

Я думаю, это потому, что IE запускает изменение, когда фокус теряется на чеках и радио. поэтому, если предупреждение появляется, фокус теряется, и событие изменения срабатывает.

EDIT:

попробуйте изменить селектор $('input') на $('input:not(:radio)')

так что щелчок сработает для ваших радиостанций и изменения для всех ваших остальных.

Редактировать # 2:

Как поместить вещи, происходящие при изменении, в отдельную функцию. с индексом в качестве параметра. затем вы можете вызвать эту функцию из change () и click (). после того, как вы закончите с щелчком мыши, вызовите эту функцию.

0 голосов
/ 16 сентября 2010

Вы объявляете вашу переменную blnCheck внутри одной из ваших функций document.ready () (вам также не нужны две из них, она может быть в одной.

Это означает, что объявленная вами переменная не будет той, которая используется при фактическом вызове вашей функции изменения, вместо этого вы получите некий неявный глобал. Не знаю, является ли это частью этого, но, возможно, стоит посмотреть. Вы должны объявить это в верхней части вашего файла JS.

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