JQuery onchange работает несколько раз в jsfiddle, но только один раз в браузере

Я добавил скрипт jquery (1.11.1) на страницу корзины сайта бизнес-катализатора, чтобы скрыть или отобразить сообщение в зависимости от того, какой раскрывающийся список щелкает пользователь. Он работает несколько раз в jsfiddle http://jsfiddle.net/NathanHill/462tk/, но только один раз в мой браузер. В настоящее время javascript находится в строке после раскрывающегося списка.

У меня нет контроля над раскрывающимся списком html, поэтому я не могу вставить какую-либо функцию в html onchange.

HTML:

<select onchange="SomeBCfunction(a,b,c);" id="shippingCountry">
    <option value="AF">AFGHANISTAN</option>
    <option value="AX">ALAND ISLANDS</option>
    <option value="GB" selected="selected">UNITED KINGDOM</option>
</select>

<div id="zones">Show message</div>

Javascript:

<script type="text/javascript">
    $(document).ready(function(){
        $('#shippingCountry').on('change', function() {
            if ( this.value == 'GB')
            {
                $("#zones").show();
            }
            else
            {
                $("#zones").hide();
            }
        });
    });
</script>

Любая помощь будет оценена по достоинству.

Я попытался добавить/дополнить существующую функцию BC, которая запускается. Например:

var SomeBCfunction = oldBCfunction 
Function SomeBCfunction (){ 
//my hide-display code 
oldBCfunction; 
} 

но с этим ничего не вышло...


person user2107891    schedule 27.06.2014    source источник
comment
Скрипт добавлен в голову?   -  person Joakim M    schedule 27.06.2014
comment
Прежде всего, вы удаляете это onchange=SomeBCfunction(a,b,c); из тега. тогда попробуй   -  person Anoop Joshi    schedule 27.06.2014
comment
Согласен с @AnoopJoshi. Добавить $('#shippingCountry').removeAttr('onchange'); Перед вашей новой сменой.   -  person StaticVoid    schedule 27.06.2014
comment
У меня нет контроля над onchange=SomeBCfunction(a,b,c); - генерируется БК.   -  person user2107891    schedule 27.06.2014


Ответы (4)


Он отлично работает на версии Chrome 35.0.1916.153 m.

Пс. Удалена функция onchange="SomeBCfunction(a,b,c);" чтобы браузер не выдавал ошибку каждый раз, когда вы изменяете выбранный элемент, но даже при включении он работает несколько раз, хотя, если он не используется, вы должны удалить его.

<head>
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
</head>
<div class='required'>
    <select id="shippingCountry"> 
        <option value="AF">AFGHANISTAN</option>
        <option value="AX">ALAND ISLANDS</option>
        <option value="GB" selected="selected">UNITED KINGDOM</option>   
    </select>
    <div id="zones">Show message</div>
</div>
<script type='text/javascript'>
 $(document).ready(function(){ 
     $('#shippingCountry').on('change', function() {
      if ( this.value == 'GB')
      {
        $("#zones").show();
      }
      else
      {
        $("#zones").hide();
      }
    });
  });
</script>
person valter.santos.matos    schedule 27.06.2014
comment
У меня нет контроля над onchange, написанным в html. Он генерируется бизнес-катализатором. - person user2107891; 27.06.2014
comment
Какой браузер вы тестируете? - person valter.santos.matos; 27.06.2014
comment
Итак, я предполагаю, что функция onchange что-то меняет в выборе или в распространении события, не знаю, как вы можете решить это без доступа к этой функции. - person valter.santos.matos; 27.06.2014
comment
Нет ли способа добавить скрипт отображения/скрытия в существующую функцию SomeBCfunction(a,b,c); без доступа к этой функции? - person user2107891; 27.06.2014

Не лучший способ, но вы пробовали

$('#shippingCountry').on('click', function() {

А вы проверяли, не блокирует ли или не использует ли какие-либо другие скрипты эти события?

person jungerislaender    schedule 27.06.2014
comment
Я не уверен, что это блокирует или использует эти события - у меня очень ограниченный доступ к сценариям, которые использует бизнес-катализатор, особенно в процессе корзины покупок. Есть ли способ узнать? - person user2107891; 27.06.2014
comment
проверьте все другие включенные сценарии на сайте на наличие $('#shippingCountry').on('change', function() { - person jungerislaender; 27.06.2014
comment
не могли бы вы поместить console.log('Debugging') в свой скрипт и проверить, записывается ли вывод консоли только один раз? - person jungerislaender; 27.06.2014
comment
Извините - я все еще новичок в javascript - вам нужно будет немного более конкретно указать, какие шаги я должен выполнить с console.log - person user2107891; 27.06.2014
comment
‹script type=text/javascript› $(document).ready(function(){ $('#shippingCountry').on('change', function() { console.log(Debug); //Добавьте это сюда, если ( this.value == 'GB') { $(#zones).show(); } else { $(#zones).hide(); } }); }); ‹/script› Запустите свой скрипт, нажмите F12, откройте консоль и посмотрите, как часто происходит отладка. - person jungerislaender; 27.06.2014
comment
Это показывает каждый раз, когда я меняю страну в консоли: Отказался устанавливать небезопасный заголовок Connection AjaxPro.Request.invoke AjaxPro.AjaxClass.invoke Object.extend.Object.extend.ServerSideSetShippingCountry SetShippingCountry onchange - person user2107891; 27.06.2014

Вы пытались просто создать функцию, которую BC записывает в HTML?

 function SomeBCfunction() {
     if $('#shippingCountry').val() == "GB" {
       $("#zones").show();
        }
        else
        {
            $("#zones").hide();
        }
      }
  }

Возможно, вы могли бы переопределить старую функцию новой и включить нужное вам действие:

 var old_foo = foo;
     foo = function() {
      old_foo();
     bar();
  }
person Dean.DePue    schedule 27.06.2014
comment
Не изначально, так как я думал, что это будет конфликтовать с реальной функцией SomeBCfunctions - я только что протестировал ее, и она не работает... Могу ли я как-нибудь это исправить? - person user2107891; 27.06.2014
comment
Так уже есть функция с таким именем? Ничего себе, тогда вы создаете конфликты и путаете JS. Можем ли мы увидеть, как выглядит созданная функция BC? - person Dean.DePue; 27.06.2014
comment
Да, у меня нет доступа к этой функции, поэтому я даже не могу сказать вам, как она выглядит. - person user2107891; 27.06.2014
comment
Можете ли вы сделать извлечение исходного кода страницы, а затем показать нам? - person Dean.DePue; 27.06.2014
comment
функция SomeBC: function SetShippingCountry(e,t,n){var r=document.getElementById(shippingPostcode);var i=;var s=document.getElementById(shippingState);var o=;var u=document.getElementById(catCartDetails );if(u){if(r)i=r.value;if(s){if(s.selectedIndex›0)o=s[s.selectedIndex].text}var a=CMS.OrderRetrievev2.ServerSideSetShippingCountry( t,e,o,i,n);u.innerHTML=a.value}} - person user2107891; 27.06.2014

При каждом изменении BC отбрасывает все содержимое #catCartDetails, включая все прикрепленные вами обработчики событий.

Вы можете предотвратить или зацепиться за это, переопределив функцию window.UpdateShipping(), которая изначально определена в /CatalystScripts/Java_OnlineShopping.js.

В вашем случае создание функции, вызываемой после ApplyDiscountCode(), должно позволить вам отображать #zones на основе значения jQuery('#shippingCountry').find(":selected").text().

window.UpdateShipping = function(e, t, n) {
  var r = document.getElementById("catCartDetails");
  if (r) {
    var i = CMS.OrderRetrievev2.ServerSideUpdateShipping(t, e, n);
    if (i.value[0]) {
      r.innerHTML = i.value[2];

      // Your logic here:
      checkShippingCountry();
    }
    if (i.value[1].length > 0) {
      if (/(iP[ao]d|iPhone).*?Safari/.test(navigator.userAgent)) {
        setTimeout(function() {
          alert(i.value[1])
        }, 0)
      } else {
        alert(i.value[1])
      }
    }
  }
};
person Robert K. Bell    schedule 28.06.2014