2012-01-30 9 views
4

나는 오류 코드자바 스크립트 DOM 오류

select.up().appendChild(sw); 

의 줄에 다음과 같은 오류 메시지가 표시됨 "SCRIPT438 : 개체가 속성 또는 메서드 '최대'지원하지 않습니다"

이를 Internet Explorer에서만 발생합니다 ... Chrome, Safari 및 Firefox는 모두 코드를 잘 실행합니다. Google에서 "select.up()"을 (를) 검색하여 항목을 찾을 수 없습니다. 이 코드는 제 자신이 아니며 Javascript에서 DOM을 사용하는 데 익숙하지 않습니다.

<?php 
$swatches = $this->get_option_swatches(); 
?> 
<script type="text/javascript"> 
    document.observe('dom:loaded', function() { 
     try { 
      var swatches = <?php echo Mage::helper('core')->jsonEncode($swatches); ?>; 

      function find_swatch(key, value) { 
       for (var i in swatches) { 
        if (swatches[i].key == key && swatches[i].value == value) 
         return swatches[i]; 
       } 
       return null; 
      } 

      function has_swatch_key(key) { 
       for (var i in swatches) { 
        if (swatches[i].key == key) 
         return true; 
       } 
       return false; 
      } 

      function create_swatches(label, select) { 
       // create swatches div, and append below the <select> 
       var sw = new Element('div', {'class': 'swatches-container'}); 
       select.up().appendChild(sw); 

       // store these element to use later for recreate swatches 
       select.swatchLabel = label; 
       select.swatchElement = sw; 

       // hide select 
       select.setStyle({position: 'absolute', top: '-9999px'}) 

       $A(select.options).each(function(opt, i) { 
        if (opt.getAttribute('value')) { 
         var elm; 
         var key = trim(opt.innerHTML); 

         // remove price 
         if (opt.getAttribute('price')) key = trim(key.replace(/\+([^+]+)$/, '')); 

         var item = find_swatch(label, key); 
         if (item) 
          elm = new Element('img', { 
           src: '<?php echo Mage::getBaseUrl(Mage_Core_Model_Store::URL_TYPE_MEDIA); ?>swatches/'+item.img, 
           alt: opt.innerHTML, 
           title: opt.innerHTML, 
           'class': 'swatch-img'}); 
         else { 
          console.debug(label, key, swatches); 
          elm = new Element('a', {'class': 'swatch-span'}); 
          elm.update(opt.innerHTML); 
         } 
         elm.observe('click', function(event) { 
          select.selectedIndex = i; 
          fireEvent(select, 'change'); 
          var cur = sw.down('.current'); 
          if (cur) cur.removeClassName('current'); 
          elm.addClassName('current'); 
         }); 
         sw.appendChild(elm); 
        } 
       }); 
      } 

      function recreate_swatches_recursive(select) { 
       // remove the old swatches 
       if (select.swatchElement) { 
        select.up().removeChild(select.swatchElement); 
        select.swatchElement = null; 
       } 

       // create again 
       if (!select.disabled) 
        create_swatches(select.swatchLabel, select); 

       // recursively recreate swatches for the next select 
       if (select.nextSetting) 
        recreate_swatches_recursive(select.nextSetting); 
      } 

      function fireEvent(element,event){ 
       if (document.createEventObject){ 
        // dispatch for IE 
        var evt = document.createEventObject(); 
        return element.fireEvent('on'+event,evt) 
       } 
       else{ 
        // dispatch for firefox + others 
        var evt = document.createEvent("HTMLEvents"); 
        evt.initEvent(event, true, true); // event type,bubbling,cancelable 
        return !element.dispatchEvent(evt); 
       } 
      } 

      function trim(str) { 
       return str.replace(/^\s\s*/, '').replace(/\s\s*$/, ''); 
      } 


      $$('#product-options-wrapper dt').each(function(dt) { 

       // get custom option's label 
       var label = ''; 
       $A(dt.down('label').childNodes).each(function(node) { 
        if (node.nodeType == 3) label += node.nodeValue; 
       }); 
       label = trim(label); 

       var dd = dt.next(); 
       var select = dd.down('select'); 
       if (select && has_swatch_key(label)) { 
        create_swatches(label, select); 

        // if configurable products, recreate swatches of the next select when the current select change 
        if (select.hasClassName('super-attribute-select')) { 
         select.observe('change', function() { 
          recreate_swatches_recursive(select.nextSetting); 
         }); 
        } 
       } 
      }); 
     } 
     catch(e) { 
      alert("Color Swatches javascript error. Please report this error to [email protected] Error:" + e.message); 
     } 
    }); 
</script> 

이 내게 줄 수있는 통찰력 사람을 감사합니다 : 여기

코드의 나머지 부분입니다!

+1

['up()'메소드] ​​(http://prototypejs.org/api/element/up)는 Prototype에서 온 것 같습니다. –

+0

해당 코드는 라이브러리 (Prototype)를 사용하도록 작성된 것 같습니다. 그래? 그렇다면 꽤 의심스럽고 IE에서 "hasClassName()", "observe()"등의 문제를 일으킬 수있는 몇 가지 사항이 있습니다. 그러나 확실하게 알 수는 없습니다. – Pointy

+0

@AndrewMarshall 아 좋아요. 기억이 안나요. 음, 함수의 시작 부분에'select = $ (select); '같은 것을 추가 할 수도 있습니다. 나는 프로토 타입으로 약간 녹슬었다. – Pointy

답변

2

저는 up()이 PrototypeJS 메서드라는 것을 확신합니다. 그래서 당신이 그것을 필요로 할 것이라고 확신합니다.

http://prototypejs.org/api/element/up

+0

사실입니다.하지만 IE에서는 모든 DOM 요소 참조가 명시 적으로 "랩핑"되어야합니다. (IE에서 DOM 프로토 타입을 확장 할 수 없기 때문에 적어도 Prototype에서는 사실이었습니다.) – Pointy

+0

select = $ (select); 그 일을 할 수도 있습니다. Darn IE. 작곡가를 위해 작동하는지 보겠습니다. –

+0

함수의 시작 부분에'select = $ (select);'를 놓았는데 여전히 같은 오류가 나타납니다 ... Prototype에 대한 참고를 보내 주셔서 감사합니다! 이 코드는 Magento 웹 사이트에서 사용되고 있으므로 Prototype이 사용됩니다. – TravelingAdMan

1

나는이 문제에 직면하고 있어요. 그래서, 난 함수의

var sw = new Element('div', {'class': 'swatches-container'}); 
$(select).up().appendChild(sw); 
select.setStyle({position: 'absolute', top: '-9999px'}) 

라인 을 create_swatches 주석과 기능 트림 (STR)에 붙여 넣습니다.

이 후 다시 오류가 발생하지 않았습니다.

+0

정확한 코드를 제공해주세요. – mjdevloper