【问题标题】:How to use jquery noconflict in Joomla如何在 Joomla 中使用 jquery noconflict
【发布时间】:2014-03-25 15:31:32
【问题描述】:

我正在使用 PHP、javascript Json 来填充表单中的字段。一切正常,直到我将 joomla 从 3.1.5 升级到 3.2.2。我相信它与 jquery 冲突。

所以这里是我使用的代码。如果我使用这个独立的,它绝对可以正常工作,但在 Joomla 中不起作用。

请帮我解决这个 jquery 冲突。

<?php

try {

    $objDb = new PDO('mysql:host=localhost;dbname=prod', 'xxx', 'xxxx');
    $objDb->exec('SET CHARACTER SET utf8');

    $sql = "SELECT id, Master, Area, Rate1
            FROM `products`
            WHERE `Master` = 0";
    $statement = $objDb->query($sql);
    $list = $statement->fetchAll(PDO::FETCH_ASSOC);

} catch(PDOException $e) {
    echo 'There was a problem';
}

?>
<!DOCTYPE HTML>
<html lang="en">
<head>
    <meta charset="utf-8" />
    <link href="/1/finished/css/core.css" rel="stylesheet" type="text/css" />
    <!--[if lt IE 9]>
    <script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script>
    <![endif]-->
</head>
<body>
<script>
function sendForm() {
    document.myform.submit()
}
</script>

<div id="wrapper">

    <form id="myform" action="/index.php/it-hardware-disposal-cost-upto-25-items" method="post">

        <select name="Area" id="Area" class="update">
            <option value="">Select Your Location</option>
            <?php if (!empty($list)) { ?>
                <?php foreach($list as $row) { ?>
                    <option value="<?php echo $row['id']; ?>">
                        <?php echo $row['Area']; ?>
                    </option>
                <?php } ?>
            <?php } ?>
        </select>

        <select name="County" id="County" class="update"
            disabled="disabled">
            <option value="">----</option>
        </select>

        <select name="City" id="City" class="update"
            disabled="disabled" onchange="this.form.submit()">
            <option value="">----</option>
        </select>


    </form>

</div>


<script src="/1/finished/js/jquery-1.6.4.min.js" type="text/javascript"></script>
<script src="/1/finished/js/core.js" type="text/javascript"></script>
</body>
</html>

下面是core.js 我坚信问题出在这里,可能是因为joomla中的一些其他代码有冲突。

var formObject = {
        run : function(obj) {
                if (obj.val() === '') {
                        obj.nextAll('.update').html('<option value="">----</option>').attr('disabled', true);
                } else {
                        var id = obj.attr('id');
                        var v = obj.val();
                        jQuery.getJSON('/1/finished/mod/update.php', { id : id, value : v }, function(data) {
                                if (!data.error) {
                                        obj.next('.update').html(data.list).removeAttr('disabled');
                                } else {
                                        obj.nextAll('.update').html('<option value="">----</option>').attr('disabled', true);
                                }
                        });
                }
        }
};
$(function() {

        $('.update').live('change', function() {
                formObject.run($(this));
        });

});

所以 Core.js 使用 Jquery.json 使用 update.php 填充数据,其中包含以下代码。

<?php
if (!empty($_GET['id']) && !empty($_GET['value'])) {

        $id = $_GET['id'];
        $value = $_GET['value'];

        try {

                $objDb = new PDO('mysql:host=localhost;dbname=xxxx', 'xxx', 'xxx');
                $objDb->exec('SET CHARACTER SET utf8');

                $sql = "SELECT id, Master, Area
                                FROM `products`
                                WHERE `master` = ?";
                $statement = $objDb->prepare($sql);
                $statement->execute(array($value));
                $list = $statement->fetchAll(PDO::FETCH_ASSOC);

                if (!empty($list)) {

                        $out = array('<option value="">Select Your Area, City</option>');

                        foreach($list as $row) {
                                $out[] = '<option value="'.$row['id'].'">'.$row['Area'].'</option>';
                        }

                        echo json_encode(array('error' => false, 'list' => implode('', $out)));

                } else {
                        echo json_encode(array('error' => true));
                }

        } catch(PDOException $e) {
                echo json_encode(array('error' => true));
        }

} else {
        echo json_encode(array('error' => true));
}
?>

【问题讨论】:

  • 如果您将 jQuery 安装到 Joomla 上,那么这可能是真的。此外,您应该在 Google 或 Stack Overflow 上搜索过:api.jquery.com/jQuery.noConflict
  • SparoHawk,如果我知道如何解决它;我不会在这里发帖寻求帮助。你能看出我应该怎么做才能解决它吗?
  • 您能发布您遇到的错误吗?
  • 我没有收到任何错误,但未填充字段。如果我选择字段中的值,我可以看到第一个字段,第二个字段应该自动填充选择选项并且它不会发生。

标签: javascript php jquery json conflict


【解决方案1】:

我相信 jQuery live 方法在 Joomla 中包含的 jQuery 版本中已被弃用。它适用于示例代码,因为您正在加载 jQuery 1.6.4。在 Joomla 代码中尝试链接:

$(function() {

        $('.update').live('change', function() {
                formObject.run($(this));
        });

});

到这里:

jQuery(function() {

        jQuery('.update').on('change', function() {
                formObject.run(jQuery(this));
        });

});

看看它是否有效。

编辑

我附上了链接中的屏幕截图,其中有两个我们应该首先解决的错误。

  1. 脚本 tabs-state.js 抛出错误 jQuery not defined。这很可能意味着您尚未加载 jQuery 库,从而导致错误。
  2. bootsrap.min.js 抛出一个错误,指出没有“on”方法表明 jQuery 已加载,但版本较旧。 Joomla 3.x 附带 1.8.23,但查看网页上的 DOM 显示正在加载 1.6 版。

使用Joomla核心加载jQuery和Bootstrap的正确方法如下:

JHtml::_('jquery.framework');
JHtml::_('bootstrap.framework');

您应该删除任何手动加载这些框架的行,如果可能,将这些方法放在模板的 index.php 顶部,以确保在任何其他嵌入式脚本运行之前加载它们。

尝试解决这些问题,看看这些错误是否已从控制台中删除,以及您的代码在正确加载后是否按预期执行。

【讨论】:

  • 我试过了,结果没有什么不同,还是不行。您能想到可能导致此问题的原因吗?
  • 当您查看浏览器控制台日志时,是否有任何错误?您有我可以导航到的面向公众的链接吗?
  • 我必须说你是个天才,它现在正在工作。
【解决方案2】:

在 Joomla 中使用 jQuery 时,最好使用 jQuery() 而不是工厂符号 $()。所以你没有冲突。 Joomla 默认使用 MooTools,因此 MooTools 拥有工厂符号的所有权。

否则需要使用jQuery.noConflict()

例如.. 所以这个:

$(function() {

    $('.update').live('change', function() {
            formObject.run($(this));
    });

});

会变成这样:

jQuery(function() {

    jQuery('.update').live('change', function() {
            formObject.run(jQuery(this));
    });

});

一个如何使用jQuery.noConflict()的例子,所以你可以使用$()工厂符号:

<!-- Another way to put jQuery into no-conflict mode. -->
<script src="mootools-core.js"></script>
<script src="jquery-min.js"></script>
<script>
jQuery.noConflict();
jQuery( document ).ready(function( $ ) {
       // You can use the locally-scoped $ in here as an alias to jQuery.
       $( "div" ).hide();
});

// The $ variable in the global scope has the mootools-core.js meaning.
window.onload = function(){
   var mainDiv = $( "main" );
}
</script>

Joomla 也有用于 jQuery noConflict 的插件,因此如果您不想自己添加,也可以使用其中一个插件。

要查看的 Joomla 插件:

jQuery Easy

jQuery Scripts Joomla Plugins

您要么必须在自定义 jQuery 代码之前使用 jQuery.noConflict(),要么总是必须使用 jQuery(),而不是 $( )

看看有没有帮助!

更新

如果你打开你的浏览器控制台,你会看到你有 5 个 JavaScript 错误。比如 jQuery 没有被定义,还有其他的错误取决于 jQuery。此外,如果您查看脚本的加载顺序,您会发现 jQuery 是在其他依赖于 jQuery 的脚本之后加载的。您必须确保 jQuery 在 Joomla 中正确加载,并且所有错误都已修复以使您的代码正常工作。

【讨论】:

  • 我试过了,结果没有什么不同,还是不行。您能想到可能导致此问题的原因吗?
  • @user2107349 - 你尝试了我的所有想法,还是只尝试了一个?检查用于 Joomla 3.2.2 版本的 jQuery 版本,看看您是否使用了任何已弃用的 jQuery 方法。
  • @user2107349 如果您打开浏览器控制台,您会看到类似 5 JavaScript 错误.. 像 jQuery 未定义,以及其他取决于 jQuery 的错误。此外,如果您查看脚本的加载顺序,您会发现 jQuery 是在其他依赖于 jQuery 的脚本之后加载的。您必须确保 jQuery 在 Joomla 中正确加载,并且所有错误都已修复以使您的代码正常工作。
猜你喜欢
  • 1970-01-01
  • 2011-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-18
  • 2011-03-10
  • 1970-01-01
相关资源
最近更新 更多