高分求助大侠帮忙改段代码

sankgod 2014-10-18 06:14:33
某个函数调用getJSONP的代码1:
 $.getJSONP("http://d.360buy.com/area/get?fid=" + areaId + "&callback=getAreaListcallback");


js代码2:
!function ($) {
$.extend({
_jsonp: {
scripts: {},
counter: 1,
charset: "gb2312",
head: document.getElementsByTagName("head")[0],
name: function (callback) {
var name = "_jsonp_" + (new Date).getTime() + "_" + this.counter;
this.counter++;
var cb = function (json) {
eval("delete " + name),
callback(json),
$._jsonp.head.removeChild($._jsonp.scripts[name]),
delete $._jsonp.scripts[name];
};
return eval(name + " = cb"),
name;
},
load: function (a, b) {
var c = document.createElement("script");
c.type = "text/javascript",
c.charset = this.charset,
c.src = a,
this.head.appendChild(c),
this.scripts[b] = c;
}
},
getJSONP: function (a, b) {
var c = $._jsonp.name(b),
a = a.replace(/{callback};/, c);
return $._jsonp.load(a, c),
this;
}
});
}
(jQuery);


为什么我把代码2放进某个函数里进行调用时,这段代码就不起作用了呢?
小生对jquery不太熟,大侠莫见笑,怎么样把这段代码进行改写成一个函数,或者改写成能放进函数里供调用呢?
...全文
459 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
sankgod 2014-10-25
  • 打赏
  • 举报
回复
同时也感谢参与回复的各位大神,谢谢了
sankgod 2014-10-25
  • 打赏
  • 举报
回复
太感谢版主了,解决了一大难题 再次感谢!!!
sankgod 2014-10-24
  • 打赏
  • 举报
回复
版主大大能否帮我改改,这个要怎么做成插件形式呢?
Go 旅城通票 2014-10-24
  • 打赏
  • 举报
回复
sankgod 2014-10-23
  • 打赏
  • 举报
回复
引用 15 楼 showbo 的回复:
代码二一定要放进你的页面去啊,要不$.getJSONP就找不到方法了。。 代码结构一定要这样 //上面的扩展$.getJSONP一定不能少了,要不$.getJSONP就报错了找不到方法 [/code]
放进去之后,firebug显示出错原因为:getAreaListcallback is not defined 我把源码都放网盘里下载:点击这里供下载

//getAreaListcallback
function getAreaListcallback(r) {
    currentDom.html(getAreaList(r));
    if (currentAreaInfo.currentLevel >= 2) {
        currentDom.find("a").click(function () {
            if (page_load) {
                page_load = false;
            }
            if (currentDom.attr("id") == "stock_area_item") {
                currentAreaInfo.currentLevel = 3;
            }
            else if (currentDom.attr("id") == "stock_town_item") {
                currentAreaInfo.currentLevel = 4;
            }
            getStockOpt($(this).attr("data-value"), $(this).html());
        });
        if (page_load) { //初始化加载
            currentAreaInfo.currentLevel = currentAreaInfo.currentLevel == 2 ? 3 : 4;
            if (currentAreaInfo.currentAreaId && new Number(currentAreaInfo.currentAreaId) > 0) {
                getStockOpt(currentAreaInfo.currentAreaId, currentDom.find("a[data-value='" + currentAreaInfo.currentAreaId + "']").html());
            }
            else {
                getStockOpt(currentDom.find("a").eq(0).attr("data-value"), currentDom.find("a").eq(0).html());
            }
        }
    }
}

//getAreaList
function getAreaList(result) {
    //var html = "";
    //html.push(result);
    var html = ["<ul class='area-list'>"];
    var longhtml = [];
    var longerhtml = [];
    if (result && result.length > 0) {
        for (var i = 0, j = result.length; i < j; i++) {
            result[i].name = result[i].name.replace(" ", "");
            if (result[i].name.length > 12) {
                longerhtml.push("<li class='longer-area'><a href='#none' data-value='" + result[i].id + "'>" + result[i].name + "</a></li>");
            }
            else if (result[i].name.length > 5) {
                longhtml.push("<li class='long-area'><a href='#none' data-value='" + result[i].id + "'>" + result[i].name + "</a></li>");
            }
            else {
                html.push("<li><a href='#none' data-value='" + result[i].id + "'>" + result[i].name + "</a></li>");
            }
        }
    }
    else {
        html.push("<li><a href='#none' data-value='" + currentAreaInfo.currentFid + "'> </a></li>");
    }
    html.push(longhtml.join(""));
    html.push(longerhtml.join(""));
    html.push("</ul>");

    return html.join("");
}

Go 旅城通票 2014-10-23
  • 打赏
  • 举报
回复
代码二一定要放进你的页面去啊,要不$.getJSONP就找不到方法了。。 代码结构一定要这样
!function ($) {
    $.extend({
        _jsonp: {
            scripts: {},
            counter: 1,
            charset: "gb2312",
            head: document.getElementsByTagName("head")[0],
            name: function (callback) {
                var name = "_jsonp_" + (new Date).getTime() + "_" + this.counter;
                this.counter++;
                var cb = function (json) {
                    eval("delete " + name),
                        callback(json),
                        $._jsonp.head.removeChild($._jsonp.scripts[name]),
                        delete $._jsonp.scripts[name];
                };
                return eval(name + " = cb"),
                    name;
            },
            load: function (a, b) {
                var c = document.createElement("script");
                c.type = "text/javascript",
                    c.charset = this.charset,
                    c.src = a,
                    this.head.appendChild(c),
                    this.scripts[b] = c;
            }
        },
        getJSONP: function (a, b) {
            var c = $._jsonp.name(b),
                a = a.replace(/{callback};/, c);
            return $._jsonp.load(a, c),
                this;
        }
    });
}
(jQuery);
//上面的扩展$.getJSONP一定不能少了,要不$.getJSONP就报错了找不到方法
function getInfo(OutId){
  $.getJSONP("http://d.360buy.com/area/get?fid=" + areaId + "&callback=getAreaListcallback");
}
sankgod 2014-10-23
  • 打赏
  • 举报
回复
引用 13 楼 showbo 的回复:
理解错了。。 以为是代码2放到函数体内。。 你确认代码2放入了你的页面了没有?而且getInfo(OutId)再哪里调用的,是不是对象没有生成就调用了导致找不到对象报错什么的,自己用开发工具看下报什么错误
就是因为代码2不放进去就没有样式显示...
Go 旅城通票 2014-10-23
  • 打赏
  • 举报
回复
引用 22 楼 qwdx1k2 的回复:
”所以你最好在原来的“原始的Html地址选择器”这个重新增加”还是不大明白这句话的意思。。 我来解释一下为什么要通过外层div来找到这个store-selector,因为我要把这个地址选择器做成.net控件,这样页面调用控件时,一个页面可能有多个控件,这样就有多个store-selector,引发事件冲突,都同时弹出选择器了
你压缩包里面不是有2个demo,一个是”原始的Html地址选择器“这个啊,你的另外一个也是居于这个修改的吧。。另外一个我这里测试会重复加载数据,所以修改的有问题。。 你要重新在”原始的Html地址选择器“这个进行修改,增加的函数,记得不要再将location.js的内容全部移动到你的函数内容 如果有多个控件,你需要自己做成jquery插件的形式了,楼主自己先研究下了。。我看有空了再帮你看看。。~
sankgod 2014-10-23
  • 打赏
  • 举报
回复
好像回了两遍。。。
sankgod 2014-10-23
  • 打赏
  • 举报
回复
”所以你最好在原来的“原始的Html地址选择器”这个重新增加”还是不大明白这句话的意思。。
我来解释一下为什么要通过外层div来找到这个store-selector,因为我要把这个地址选择器做成.net控件,这样页面调用控件时,一个页面可能有多个控件,这样就有多个store-selector,引发事件冲突,都同时弹出选择器了
sankgod 2014-10-23
  • 打赏
  • 举报
回复
”所以你最好在原来的“原始的Html地址选择器”这个重新增加”还是不大明白这句话的意思。。
我来解释一下为什么要通过外层div来找到这个store-selector,因为我要把这个地址选择器做成.net控件,这样页面调用控件时,一个页面可能有多个控件,这样就有多个store-selector,
save4me 2014-10-23
  • 打赏
  • 举报
回复
把你的my_location.js文件里面的代码放到DomReady里面,就可以解决你现在出错的问题,如

$(function(){
//my_location.js现有的代码
});
引用 16 楼 qwdx1k2 的回复:
放进去之后,firebug显示出错原因为:getAreaListcallback is not defined 我把源码都放网盘里下载:点击这里供下载
Go 旅城通票 2014-10-23
  • 打赏
  • 举报
回复
你在原来的基础上直接增加函数就行了吧。。干嘛要包含进去 你修改过的那个问题比较多。。会连续触发获取地址的问题,所以你最好在原来的“原始的Html地址选择器”这个重新增加

//原始的Html地址选择器原来的代码......
function getInfo(OutId){
  $.getJSONP("http://d.360buy.com/area/get?fid=" + areaId + "&callback=getAreaListcallback");
}
sankgod 2014-10-23
  • 打赏
  • 举报
回复
引用 17 楼 showbo 的回复:
老大。。。你的getAreaListcallback放到getValue里面去了啊。。这样只能在getValue函数体内访问。 jsonp的回调需要getAreaListcallback为window作用域内的,要不找不到这个回调 function getAreaListcallback 改为window.getAreaListcallback = function (r) { 不过你的“修改的Html地址选择器_加外层div”这个代码问题比较多,都是作用域的问题。。而且触发了好多次获取地址的请求。。 你的“原始的Html地址选择器”这个示例不是好好的吗。你要增加getValue直接加代码就行了,干嘛“修改的Html地址选择器_加外层div”要把原来的代码都放到getValue这个函数体内呢? ....
原来是要windows作用域,原来我以为调用了jsonp就要把那段扩展函数包进去,才能有效果. 但是不把原来的代码放到getValue这个函数体内,我怎么才能把外层Div的Id传给getValue呢?我需要通过它来找到store-selector呀?
Go 旅城通票 2014-10-23
  • 打赏
  • 举报
回复
老大。。。你的getAreaListcallback放到getValue里面去了啊。。这样只能在getValue函数体内访问。

jsonp的回调需要getAreaListcallback为window作用域内的,要不找不到这个回调

function getAreaListcallback

改为window.getAreaListcallback = function (r) {

不过你的“修改的Html地址选择器_加外层div”这个代码问题比较多,都是作用域的问题。。而且触发了好多次获取地址的请求。。

你的“原始的Html地址选择器”这个示例不是好好的吗。你要增加getValue直接加代码就行了,干嘛“修改的Html地址选择器_加外层div”要把原来的代码都放到getValue这个函数体内呢?

如果你是要加载指定区域信息,“原始的Html地址选择器”就已经做好了,修改下CurrentAreaInfoInit,变换下currentAreaInfo信息就行,getValue这个自定义函数都不需要了


function CurrentAreaInfoInit(proid,cityid,areaid,townid){
currentAreaInfo = {"currentLevel": 1,"currentProvinceId": 1,"currentProvinceName":"北京","currentCityId": 0,"currentCityName":"","currentAreaId": 0,"currentAreaName":"","currentTownId":0,"currentTownName":""};
var ipLoc = getCookie("ipLoc-djd");
ipLoc = ipLoc ? ipLoc.split("-") : [proid || 1, cityid || 72, areaid || 0, townid || 0];
if(ipLoc.length>0&&ipLoc[0]){
currentAreaInfo.currentProvinceId = ipLoc[0];
currentAreaInfo.currentProvinceName = getNameById(ipLoc[0]);
}
if(ipLoc.length>1&&ipLoc[1]){
currentAreaInfo.currentCityId = ipLoc[1];
}
if(ipLoc.length>2&&ipLoc[2]){
currentAreaInfo.currentAreaId = ipLoc[2];
}
if(ipLoc.length>3&&ipLoc[3]){
currentAreaInfo.currentTownId = ipLoc[3];
}
//////////////////
chooseProvince(currentAreaInfo.currentProvinceId);//加载省,需要一级一级加载,不能越级,就是要先初始化省,再到市,县,镇,直接跨级调用镇的数据前面省市县会不匹配
}
//加载广西,桂林,七星区
CurrentAreaInfoInit(20,1726,22885);


(function(){
$("#store-selector").unbind("mouseover").bind("mouseover",function(){
$('#store-selector').addClass('hover');
$("#store-selector .content,#JD-stock").show();
}).find("dl").remove();
//CurrentAreaInfoInit();

原来的这句注释掉,会导致并发请求出现问题。。
Go 旅城通票 2014-10-22
  • 打赏
  • 举报
回复
引用 5 楼 qwdx1k2 的回复:
[quote=引用 4 楼 showbo 的回复:] 放代码2的函数一定要先执行才能执行代码1,应为1调用的方法是代码2中扩展的,如果那个函数没有执行当然无法找到getJSONP方法
版主说的对,但是我需要把那个扩展函数放进getInfo(OutId)里,怎么样把这个扩展函数改写成能放进一个函数里的代码呢? 比如代码3:

function getInfo(OutId){
 //var areaId = $(OutId).find("#DivId").text();
//alert(areaId);
$.getJSONP("http://d.360buy.com/area/get?fid=" + areaId + "&callback=getAreaListcallback");
}
求指教~ [/quote] 为什么一定要放函数体里面呢?直接扩展不就好了?而且jquery的jsonp操作只是增加一个script标签到head里面,应该不会影响到你的布局,只可能你后续的操作导致布局错乱
sankgod 2014-10-22
  • 打赏
  • 举报
回复
顶起,有没有大侠帮忙啊
Go 旅城通票 2014-10-22
  • 打赏
  • 举报
回复
引用 12 楼 qwdx1k2 的回复:
因为不放进函数体里,OutId就没法传进去呀 由于做成.net用户控件,控件外层有DIV,在不同的页面这个DIV的ID各不相同,如Addr1,通过Addr1找到控件的输入框DivId,所以要传入这个Addr1.


$("#Addr1").mouseover(function () {
    //alert("addr1 is OK!"); 
    OutId = "#Addr1";
     getInfo(OutId);
});
function getInfo(OutId){
 //var areaId = $(OutId).find("#DivId").text();
//alert(areaId);
$.getJSONP("http://d.360buy.com/area/get?fid=" + areaId + "&callback=getAreaListcallback");
}
理解错了。。 以为是代码2放到函数体内。。 你确认代码2放入了你的页面了没有?而且getInfo(OutId)再哪里调用的,是不是对象没有生成就调用了导致找不到对象报错什么的,自己用开发工具看下报什么错误
sankgod 2014-10-22
  • 打赏
  • 举报
回复
因为不放进函数体里,OutId就没法传进去呀 由于做成.net用户控件,控件外层有DIV,在不同的页面这个DIV的ID各不相同,如Addr1,通过Addr1找到控件的输入框DivId,所以要传入这个Addr1.


$("#Addr1").mouseover(function () {
    //alert("addr1 is OK!"); 
    OutId = "#Addr1";
     getInfo(OutId);
});
function getInfo(OutId){
 //var areaId = $(OutId).find("#DivId").text();
//alert(areaId);
$.getJSONP("http://d.360buy.com/area/get?fid=" + areaId + "&callback=getAreaListcallback");
}
sankgod 2014-10-19
  • 打赏
  • 举报
回复
引用
好的。


function getAreaListcallback(r) {
    currentDom.html(getAreaList(r));
    if (currentAreaInfo.currentLevel >= 2) {
        currentDom.find("a").click(function () {
            if (page_load) {
                page_load = false;
            }
            if (currentDom.attr("id") == "stock_area_item") {
                currentAreaInfo.currentLevel = 3;
            }
            else if (currentDom.attr("id") == "stock_town_item") {
                currentAreaInfo.currentLevel = 4;
            }
            getStockOpt($(this).attr("data-value"), $(this).html());
        });
        if (page_load) { //初始化加载
            currentAreaInfo.currentLevel = currentAreaInfo.currentLevel == 2 ? 3 : 4;
            if (currentAreaInfo.currentAreaId && new Number(currentAreaInfo.currentAreaId) > 0) {
                getStockOpt(currentAreaInfo.currentAreaId, currentDom.find("a[data-value='" + currentAreaInfo.currentAreaId + "']").html());
            }
            else {
                getStockOpt(currentDom.find("a").eq(0).attr("data-value"), currentDom.find("a").eq(0).html());
            }
        }
    }
}

加载更多回复(8)

87,915

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧