getting Uncaught TypeError: undefined is not a function when call controller function with ajax in magento
getting Uncaught TypeError: undefined is not a function when call controller function with ajax in magento
我在管理中创建了名为 createadmincontroller 模块的自定义模块,它配置 config.xml.i 想要从 .phtml 中调用控制器索引函数 ajax 但它抛出错误“Uncaught TypeError: undefined is not a function”
谁能告诉我哪里出错了?以下是我的完整模块详细信息:
我的代码是:
JR->CreateAdminController->controllers->Adminhtml->CustomController.php
<?php
class JR_CreateAdminController_Adminhtml_CustomController extends Mage_Adminhtml_Controller_Action
{
public function indexAction()
{
if(isset($_POST['data'])){
echo 'successful';
//exit;
}
$this->loadLayout()
->_setActiveMenu('mycustomtab')
->_title($this->__('Index Action'));
$this->renderLayout();
}
?>
JR->CreateAdminController->etc->config.xml
<?xml version="1.0"?>
<config>
<modules>
<JR_CreateAdminController>
<version>1.0.0</version>
</JR_CreateAdminController>
</modules>
<global>
<helpers>
<jr_createadmincontroller>
<!-- Helper definition needed by Magento -->
<class>Mage_Core_Helper</class>
</jr_createadmincontroller>
</helpers>
</global>
<admin>
<routers>
<adminhtml>
<args>
<modules>
<jr_createadmincontroller before="Mage_Adminhtml">JR_CreateAdminController_Adminhtml</jr_createadmincontroller>
</modules>
</args>
</adminhtml>
</routers>
</admin>
<adminhtml>
<layout>
<updates>
<petra>
<file>createadmincontroller.xml</file>
</petra>
</updates>
</layout>
</adminhtml>
app->design->adminhtml->default->default->layout->createadmincontroller.xml
<?xml version="1.0"?>
<layout version="0.1.0">
<adminhtml_custom_index>
<reference name="content">
<block type="adminhtml/template" name="createadmincontroller" template="createadmincontroller/index.phtml" />
</reference>
</adminhtml_custom_index>
</layout>
app->design->adminhtml->default->default->template->createadmincontroller->index.phtml
<button type="button" class="scalable" onclick="test()">Click Me!</button>
<script>
function test(){
alert("wao");
var t = '<?php echo Mage::getUrl('*/custom'); ?>';
$.ajax({
url: "<?php echo $this->getUrl('*/custom/'); ?>"
}).done(function() {
alert("Hey");
});
}
</script>
JR->CreateAdminController->Helper->Data.php
<?php
class JR_CreateAdminController_Helper_Data extends Mage_Core_Helper_Abstract
{}
?>
您尝试过使用 jQuery.ajax()
而不是 $.ajax()
吗?
Magento 使用 Prototype JS,它已经声明了 $
全局变量。所以需要使用jQuery in no-conflict模式,改用jQuery
。
备选方案
- 在与
var $j = jQuery.noConflict();
应用无冲突模式后使用$j.ajax()
(感谢@b.enoit.be)
- 将您的 jQuery 代码包裹在闭包中:
(function($){ .... $.ajax() .... })(jQuery);
(另见此处 JavaScript / jQuery closure function syntax)
将 jQuery 添加到 Magento
更改布局 XML 文件 createadmincontroller.xml
:
<?xml version="1.0"?>
<layout version="0.1.0">
<adminhtml_custom_index>
<reference name="head">
<action method="addItem">
<type>skin_js</type>
<script>js/jquery-1.x.x.js</script>
</action>
<block type="core/text" name="jquery.noconflict">
<action method="setText">
<text><![CDATA[<script type="text/javascript">var $j = jQuery.noConflict();</script>]]>
</text>
</action>
</block>
</reference>
<reference name="content">
<block type="adminhtml/template" name="createadmincontroller" template="createadmincontroller/index.phtml" />
</reference>
</adminhtml_custom_index>
</layout>
我在管理中创建了名为 createadmincontroller 模块的自定义模块,它配置 config.xml.i 想要从 .phtml 中调用控制器索引函数 ajax 但它抛出错误“Uncaught TypeError: undefined is not a function” 谁能告诉我哪里出错了?以下是我的完整模块详细信息:
我的代码是:
JR->CreateAdminController->controllers->Adminhtml->CustomController.php
<?php
class JR_CreateAdminController_Adminhtml_CustomController extends Mage_Adminhtml_Controller_Action
{
public function indexAction()
{
if(isset($_POST['data'])){
echo 'successful';
//exit;
}
$this->loadLayout()
->_setActiveMenu('mycustomtab')
->_title($this->__('Index Action'));
$this->renderLayout();
}
?>
JR->CreateAdminController->etc->config.xml
<?xml version="1.0"?>
<config>
<modules>
<JR_CreateAdminController>
<version>1.0.0</version>
</JR_CreateAdminController>
</modules>
<global>
<helpers>
<jr_createadmincontroller>
<!-- Helper definition needed by Magento -->
<class>Mage_Core_Helper</class>
</jr_createadmincontroller>
</helpers>
</global>
<admin>
<routers>
<adminhtml>
<args>
<modules>
<jr_createadmincontroller before="Mage_Adminhtml">JR_CreateAdminController_Adminhtml</jr_createadmincontroller>
</modules>
</args>
</adminhtml>
</routers>
</admin>
<adminhtml>
<layout>
<updates>
<petra>
<file>createadmincontroller.xml</file>
</petra>
</updates>
</layout>
</adminhtml>
app->design->adminhtml->default->default->layout->createadmincontroller.xml
<?xml version="1.0"?>
<layout version="0.1.0">
<adminhtml_custom_index>
<reference name="content">
<block type="adminhtml/template" name="createadmincontroller" template="createadmincontroller/index.phtml" />
</reference>
</adminhtml_custom_index>
</layout>
app->design->adminhtml->default->default->template->createadmincontroller->index.phtml
<button type="button" class="scalable" onclick="test()">Click Me!</button>
<script>
function test(){
alert("wao");
var t = '<?php echo Mage::getUrl('*/custom'); ?>';
$.ajax({
url: "<?php echo $this->getUrl('*/custom/'); ?>"
}).done(function() {
alert("Hey");
});
}
</script>
JR->CreateAdminController->Helper->Data.php
<?php
class JR_CreateAdminController_Helper_Data extends Mage_Core_Helper_Abstract
{}
?>
您尝试过使用 jQuery.ajax()
而不是 $.ajax()
吗?
Magento 使用 Prototype JS,它已经声明了 $
全局变量。所以需要使用jQuery in no-conflict模式,改用jQuery
。
备选方案
- 在与
var $j = jQuery.noConflict();
应用无冲突模式后使用$j.ajax()
(感谢@b.enoit.be) - 将您的 jQuery 代码包裹在闭包中:
(function($){ .... $.ajax() .... })(jQuery);
(另见此处 JavaScript / jQuery closure function syntax)
将 jQuery 添加到 Magento
更改布局 XML 文件 createadmincontroller.xml
:
<?xml version="1.0"?>
<layout version="0.1.0">
<adminhtml_custom_index>
<reference name="head">
<action method="addItem">
<type>skin_js</type>
<script>js/jquery-1.x.x.js</script>
</action>
<block type="core/text" name="jquery.noconflict">
<action method="setText">
<text><![CDATA[<script type="text/javascript">var $j = jQuery.noConflict();</script>]]>
</text>
</action>
</block>
</reference>
<reference name="content">
<block type="adminhtml/template" name="createadmincontroller" template="createadmincontroller/index.phtml" />
</reference>
</adminhtml_custom_index>
</layout>