JQuery+Ajax:JavaScript运行时错误:需要函数

JQuery + Ajax: JavaScript runtime error: Function expected

本文关键字:函数 运行时错误 JavaScript JQuery+Ajax      更新时间:2024-01-15

我是新手,在互联网上找不到问题的答案。

我的asp.net网页中有以下脚本。它给了我一个错误,一个函数是期望的。

当我使用硬编码的城市名称和硬编码的div id时,它运行得很好,但从我开始使用循环动态更改1)要使用的url、2)城市名称和3)div id的那一刻起,我就收到了错误。有什么解决方案吗?提前感谢!

    jQuery(document).ready(function ($) {
        var strurl;
        var encodedUrl;
        var city;
        var cities = ["firenze", "rome", "milan", "venice", "perugia", "urbino"];
        for (var i = 1; i < 7; ++i) {
            city = cities(i - 1);
            strurl.toString = "http://api.aerisapi.com/observations/" + city + ",it?client_id=ZPYsvZLE4U9tkifhy3XMc&client_secret=IwQPYv7GA9XYR0bc9ziJ03ug5H2Tmh1gmxmAybEd";
            $.ajax({
                url: strurl,
                dataType: "jsonp",
                success: function (json) {
                    if (json.success == true) {
                        var ob = json.response.ob;
                        var weather = ob.weather.toLowerCase();
                        $('#js' + i + '1').html(city + ': ');
                        $('#js' + i + '2').html(weather);
                        $('#js' + i + '3').html(ob.tempC + '°');
                    }
                    else {
                        alert('An error occurred: ' + json.error.description);
                    }
                }
            });
        };            
    });

问题就在这里:

city = cities(i - 1)

应该是:

city = cities[i - 1]

cities变量是一个数组,因此您可以使用[]表示法访问其元素——您的代码使用括号,这意味着JS试图将其视为函数调用。

在我看来,不是for条件下硬编码数组的长度,而是使用其.length属性会更明智:

for (var i = 1; i <= cities.length; ++i) {
        city = cities[i-1];

然后你将遇到的下一个问题是,你试图在$.ajax()成功回调中使用i,但这些$.ajax()调用中的每一个都是异步的,所以当成功回调运行时,循环将完成,i将为7。解决这个问题的最简单方法是使用jQuery的$.each()方法迭代数组(而不是for循环),这样每个ajax调用都包含在自己的函数调用中,并获得自己的i:

    var cities = ["firenze", "rome", "milan", "venice", "perugia", "urbino"];
    $.each(cities, function(i, city) {
        var strurl.toString = "http://api.aerisapi.com/observations/" + city + ",it?client_id=ZPYsvZLE4U9tkifhy3XMc&client_secret=IwQPYv7GA9XYR0bc9ziJ03ug5H2Tmh1gmxmAybEd";
        $.ajax({
            url: strurl,
            dataType: "jsonp",
            success: function (json) {
                if (json.success == true) {
                    var ob = json.response.ob;
                    var weather = ob.weather.toLowerCase();
                    i++;
                    $('#js' + i + '1').html(city + ': ');
                    $('#js' + i + '2').html(weather);
                    $('#js' + i + '3').html(ob.tempC + '°');
                }
                else {
                    alert('An error occurred: ' + json.error.description);
                }
            }
        });
    });