TypeError: jQueryxxxxxx 不是函数

Posted

技术标签:

【中文标题】TypeError: jQueryxxxxxx 不是函数【英文标题】:TypeError: jQueryxxxxxx is not a function 【发布时间】:2016-03-29 01:59:21 【问题描述】:

第一次打开移动应用主页时会返回错误

"TypeError: Jqueryxxxxxx is not a function" 虽然它显示了 API 回调结果 "jQuery111309512500500950475_1459208158307("code":1,"msg":"Ok","details":"data"..." 根据 Firebug。

我必须打开不同的应用页面,然后返回主页才能查看已解析的特色商家。

JS 代码

case "page-home":
    callAjax('getFeaturedMerchant','');
    break;
case "getFeaturedMerchant":
    displayFeaturedRestaurant( data.details.data ,'list-featured');
    break;
case "getFeaturedMerchant":
    createElement('list-featured','');
    break;

API php 代码

public function actiongetFeaturedMerchant()

    $DbExt=new DbExt;  
    $DbExt->qry("SET SQL_BIG_SELECTS=1");       

    $start=0;
    $limit=200;

    $and='';
    if (isset($this->data['restaurant_name']))
        $and=" AND restaurant_name LIKE '".$this->data['restaurant_name']."%'";
    

    $stmt="SELECT a.*,
    (
    select option_value
    from 
    option
    WHERE
    merchant_id=a.merchant_id
    and
    option_name='merchant_photo'
    ) as merchant_logo

    FROM
    view_merchant a
    WHERE is_featured='2'
    AND is_ready ='2'
    AND status in ('active')
    $and
    ORDER BY sort_featured ASC
    LIMIT $start,$limit     
    ";              

    if (isset($_GET['debug']))
        dump($stmt);
    

    if ($res=$DbExt->rst($stmt))
        $data='';

        foreach ($res as $val)                 
            $data[]=array(
              'merchant_id'=>$val['merchant_id'],
              'restaurant_name'=>$val['restaurant_name'],
              'logo'=>AddonMobileApp::getMerchantLogo($val['merchant_id']),               
            );
        
        $this->details=array(
          'data'=>$data
        );
        $this->code=1;$this->msg="Ok";
        $this->output();
     else $this->msg=$this->t("No Featured Restaurant found");
    $this->output();

我很困惑,是什么导致了这个错误以及如何解决它。

编辑:添加完整的 callAjax 函数

function callAjax(action,params)


    /*add language use parameters*/
    params+="&lang_id="+getStorage("default_lang");

    dump(ajax_url+"/"+action+"?"+params);

    ajax_request = $.ajax(
url: ajax_url+"/"+action, 
data: params,
type: 'post',                  
async: false,
dataType: 'jsonp',
timeout: 6000,
crossDomain: true,
     beforeSend: function() 
if(ajax_request != null)       
   /*abort ajax*/
   hideAllModal();  
           ajax_request.abort();
 else  
,
    complete: function(data)   
ajax_request=null;           
hideAllModal();
    ,
success: function (data)     
dump(data); 
if (data.code==1)
    switch (action)
    

   case "getFeaturedMerchant":
   displayFeaturedRestaurant( data.details.data ,'list-featured');
   //$(".result-msg").text(data.details.total+" Restaurant found");
   $(".result-msg").text(data.details.total+" "+ getTrans("Featured Restaurants found",'restaurant_found')  );
   break
    )      
    else 
    /*failed condition*/
    switch(action)
       
    case "getFeaturedMerchant":
    createElement('list-featured','');
    //$(".result-msg").text(data.msg);
    break;
    
    ,
    error: function (request,error)            
        hideAllModal();     
        if ( action=="getLanguageSettings" || action=="registerMobile")
         else             
            onsenAlert( getTrans("Network error has occurred please try again!",'network_error') );     
           
    
;     

调用网址是:

http://domain.com/mobileapp/api/getFeaturedMerchant?

【问题讨论】:

您提供的代码没有帮助。您收到的错误是因为您在 jquery 不存在或未加载时使用了 jquery。你是不是像传统的php网站一样使用php来渲染app页面? 请显示callAjax的定义。 是的,伙计们,我正在使用 php 来呈现应用页面。 CallAjax 正在从 web 服务器调用一个 PHP 函数到 API 文件中。 我正在使用 Onsen UI 来构建应用程序。并且 callAjax() 应该从网络服务器的 APIcontroller.php 调用函数并返回结果。 JS代码被定义在函数callAjax(action,params)中 【参考方案1】:

这其实是jQuery在使用JSONP时处理abort方法的方式的问题,我之前也遇到过。

基本上,JSONP 的工作原理是向 DOM 添加一个脚本标签,并添加一个在执行时会触发的回调。

与 AJAX 不同,script 标签生成的请求不能被取消,所以当你像下面这样调用abort 时,它只能工作。

ajax_request.abort();

jQuery 将取消设置它注册的全局回调,在您的情况下为jQuery111309512500500950475_1459208158307,但它无法阻止脚本在加载时尝试运行它。因此,当它尝试调用现在未定义的函数时,您会收到错误消息。

就个人而言,我认为 jQuery 应该或者可以选择将这些全局处理程序设置为空函数或其他东西,但事实并非如此。在您的情况下,如果可能的话,如果您只打算在发送之前中止请求,我建议您避免发出请求。

【讨论】:

【参考方案2】:

编辑:

我看到了两个问题:

    您的代码支撑有误,导致一些意外的执行路径。 您正尝试在不受支持的 JSONP 请求上调用 .abort()。这样做会导致在尝试调用回调函数的 JSONP 脚本加载之前删除回调函数。 .abort() 将停止处理请求,但会留下您看到报告的脚本错误类型。

以下是代码支撑的注意事项:

您的代码支撑似乎是错误的,因此您执行成功回调的时间过早。当我将您的 callAjax 通过代码格式化程序放置时,它看起来像这样(请参阅标记为“问题区域”的位置

function callAjax(action, params) 

    /*add language use parameters*/
    params += "&lang_id=" + getStorage("default_lang");

    dump(ajax_url + "/" + action + "?" + params);

    ajax_request = $.ajax(
                url: ajax_url + "/" + action,
                data: params,
                type: 'post',
                async: false,
                dataType: 'jsonp',
                timeout: 6000,
                crossDomain: true,
                beforeSend: function () 
                        if (ajax_request != null) 
                            /*abort ajax*/
                            hideAllModal();
                            ajax_request.abort();
                         else ,            // <========== problem here
                        complete: function (data) 
                                ajax_request = null;
                                hideAllModal();
                            ,
                            success: function (data) 
                                dump(data);
                                if (data.code == 1) 
                                    switch (action) 

                                    case "getFeaturedMerchant":
                                        displayFeaturedRestaurant(data.details.data, 'list-featured');
                                        //$(".result-msg").text(data.details.total+" Restaurant found");
                                        $(".result-msg").text(data.details.total + " " + getTrans("Featured Restaurants found", 'restaurant_found'));
                                        break
                                    )    // <========== problem starts here
                                    else 
                                        /*failed condition*/
                                        switch (action) 
                                        case "getFeaturedMerchant":
                                            createElement('list-featured', '');
                                            //$(".result-msg").text(data.msg);
                                            break;
                                        
                                    ,
                                    error: function (request, error) 
                                        hideAllModal();
                                        if (action == "getLanguageSettings" || action == "registerMobile")  else 
                                            onsenAlert(getTrans("Network error has occurred please try again!", 'network_error'));
                                        
                                    
                                
                            ;

在问题区域添加一个缺失的大括号,你就明白了。但这仍然不正确。 success 处理程序中的两个 switch 语句语法不正确,因此也需要修复它们。我认为你的问题是你有一些抵消语法错误,允许代码以某种方式运行,但没有以正确的方式执行。

function callAjax(action, params) 

    /*add language use parameters*/
    params += "&lang_id=" + getStorage("default_lang");

    dump(ajax_url + "/" + action + "?" + params);

    ajax_request = $.ajax(
        url: ajax_url + "/" + action,
        data: params,
        type: 'post',
        async: false,
        dataType: 'jsonp',
        timeout: 6000,
        crossDomain: true,
        beforeSend: function () 
            if (ajax_request != null) 
                /*abort ajax*/
                hideAllModal();
                ajax_request.abort();
                 
        ,    // <======== Added this brace to close off the function
        complete: function (data) 
            ajax_request = null;
            hideAllModal();
        ,
        success: function (data) 
            dump(data);
            if (data.code == 1) 
                switch (action) 

                case "getFeaturedMerchant":
                    displayFeaturedRestaurant(data.details.data, 'list-featured');
                    //$(".result-msg").text(data.details.total+" Restaurant found");
                    $(".result-msg").text(data.details.total + " " + getTrans("Featured Restaurants found", 'restaurant_found'));
                    break
                )       // <============= This is out of place and so are the next few lines
                else 
                    /*failed condition*/
                    switch (action) 
                    case "getFeaturedMerchant":
                        createElement('list-featured', '');
                        //$(".result-msg").text(data.msg);
                        break;
                    
                ,
                error: function (request, error) 
                    hideAllModal();
                    if (action == "getLanguageSettings" || action == "registerMobile")  else 
                        onsenAlert(getTrans("Network error has occurred please try again!", 'network_error'));
                    
                
            
        
    );

解决此问题的一种可能方法是修复 beforeSend: 处理程序中缺少的大括号,然后将大部分 success 处理程序代码删除到此存根,然后在成功处理程序中的正确代码中添加回小心眼:

function callAjax(action, params) 

    /*add language use parameters*/
    params += "&lang_id=" + getStorage("default_lang");

    dump(ajax_url + "/" + action + "?" + params);

    ajax_request = $.ajax(
        url: ajax_url + "/" + action,
        data: params,
        type: 'post',
        async: false,
        dataType: 'jsonp',
        timeout: 6000,
        crossDomain: true,
        beforeSend: function () 
            if (ajax_request !== null) 
                /*abort ajax*/
                hideAllModal();
                ajax_request.abort();
                 
        ,    // <======== Added this brace to close off the function
        complete: function (data) 
            ajax_request = null;
            hideAllModal();
        ,
        success: function (data) 
            dump(data);
            if (data.code == 1) 
               // <=========== Removed faulty code in here
            
        
    );

原答案


那个特定的错误和网络响应看起来像是您的客户端想要来自服务器的一些数据。客户端(出于某种原因)决定它需要使用 JSONP 从服务器获取响应,因此服务器发送回 JSONP,但是发送请求的客户端代码没有通过定义适当的回调正确准备 JSONP 请求JSONP 脚本可以调用的函数。

您要么必须切换到不是 JSONP 的常规 Ajax 调用,要么我们必须查看您的 callAjax() 实现的详细信息,以了解 JSONP 响应不起作用的原因。

【讨论】:

jqueryxxxx这样的函数名似乎是$.ajax在使用dataType: 'jsonp'时自动创建的。 @Barmar - 是的,这是假设,除非callAjax() 复制了一些先前使用的由早期 jQuery 调用生成的 URL。这就是为什么我们需要查看callAjax() 代码。如果 jQuery 在此调用中生成了该名称,那么它也会生成具有该名称的相应函数,并且错误不会像它那样显示。所以有些东西显然不仅仅是一个普通的 jQuery JSONP 调用。 我正在使用 Onsen UI 来构建应用程序。并且 callAjax() 应该从网络服务器的 APIcontroller.php 调用函数并返回结果。 JS代码被定义在函数callAjax(action,params)中 @WiTonNope - 好吧,我们需要更多地了解 callAjax 在做什么,它在哪里获取用于进行 Ajax 调用的实际 URL 路径以及它是如何构建 Ajax 调用的。看起来 Onsen UI 使用了 AngularJS,它可能使用了 jQuery 的一个子集,所以这可能是 jQuery 引用的来源。我们需要了解更多关于调用 callAjax() 的信息,以及它如何构造最终用于 Ajax 调用的 URL。

以上是关于TypeError: jQueryxxxxxx 不是函数的主要内容,如果未能解决你的问题,请参考以下文章

Kerastuner Randomsearch:TypeError:('关键字参数不理解:','激活')

TypeError:实例Python之间不支持'<'

TypeError:不支持的操作数类型|:'bool'和'Q'[关闭]

TypeError:输入类型不支持 ufunc 'isnan' - seaborn Heatmap

烧瓶登录:TypeError:不支持解码Unicode

TypeError: 'str' 不支持缓冲区接口