Une autre question jquery prototype de conflit, je pense
-
16-10-2019 - |
Question
Je travaille dans le bloc d'options configurables sur la page du produit et l'insertion d'un droit de javascript dans le fond de celui-ci. Je n'avais pas eu de problèmes, mais je reçois soudainement une erreur dans la console: « Uncaught TypeError: Impossible de lire la propriété « config » undefined ». Je suppose que son erreur de conflit. Je me suis déplacé autour de l'initialisation de l'objet prototype et de commenter les choses en vain. Pouvez-vous voir ce qui ne va pas avec mon javscript au fond?
<?php
$_product = $this->getProduct();
$_attributes = Mage::helper('core')->decorateArray($this->getAllowAttributes());
?>
<div id="caitlinVendors">
<?php if ($_product->isSaleable() && count($_attributes)):?>
<dl>
<?php foreach($_attributes as $_attribute){ ?>
<div id="<?php echo $_attribute->getLabel() ?>Box" class="attributeBox">
<dt><label class="required"><em>*</em><?php echo $_attribute->getLabel() ?></label></dt>
<dd<?php if ($_attribute->decoratedIsLast){?> class="last"<?php }?>>
<div class="input-box">
<select name="super_attribute[<?php echo $_attribute->getAttributeId() ?>]" id="attribute<?php echo $_attribute->getAttributeId() ?>" class="required-entry super-attribute-select">
<option><?php echo $this->__('Choose an Option...') ?></option>
</select>
</div>
</dd>
</div>
<?php }?>
<a href="#" id="vendorsButton" class="vendorsButtonOff">Show Vendors</a>
<div class="clear"></div>
</dl>
</div>
<script type="text/javascript">//Caitlin
//dropdowns are initiated via configurable.js
var spConfig = new Product.Config(<?php echo $this->getJsonConfig() ?>);
var $j= jQuery.noConflict();
$j("#vendorsButton").on("click", function(event){ //vendor button click event
event.preventDefault();
$j('#vendorBox').css('visibility','show'); //set vendor box to visible
if ($j("#vendorBox").is(":hidden")) {
$j("#vendorBox").slideDown("fast");
} else {
$j("#vendorBox").hide();
}
});
$j('select').change(function() { //on changing the attribute input
if ($j(this).find('option:selected')[0].text=='Choose an Option...')//see if there is a value in the dropdown
{
$j('#vendorsButton').removeClass().addClass('vendorsButtonOff'); //Gray out the button and disable
console.log('i still work');
}
else
$j('#vendorsButton').removeClass().addClass('vendorsButtonOff'); //Enable and make it gold
});
</script>
<?php endif;?>
La solution
Tout d'abord essayer de commenter le code jQuery et voir si les reproduit d'erreur. Si elle ne puis il est pas lié à jQuery (capitaine évident).
Si l'erreur ne semble pas, essayez de mettre la déclaration de jQuery.noConflict()
à la fin du fichier jquery.js
. Il y a une chance que les conflits apparaissent plus élevés dans la page avant que vous appelez noConflict
.
Et au lieu de decalring la $j=jQuery.noConflict()
variable il suffit d'utiliser jQuery
au lieu de '$ j.
Par exemple au lieu de:
var $j= jQuery.noConflict();
$j('#id').hide();
juste utilisation:
jQuery('#id').hide();
a toujours travaillé pour moi sans aucun conflit.
Hors sujet (type de): Essayez d'utiliser le prototype pour des choses simples, comme des éléments masquage et d'affichage, la définition des valeurs de style. Il n'y a pas besoin d'impliquer jQuery pour des choses que vous pouvez faire en une ligne avec un prototype.
Autres conseils
J'obtiens cette erreur lorsque mon URL a une #
à la fin. Probablement un <a href="#">
qui ne fonctionne pas preventDefault()
.