解决方案 »

  1.   

    用这个$.getScript("http://d.360buy.com/area/get?fid=" + areaId + "&callback=getAreaListcallback");
      

  2.   

    放代码2的函数一定要先执行才能执行代码1,应为1调用的方法是代码2中扩展的,如果那个函数没有执行当然无法找到getJSONP方法jquery默认就支持jsonp了function getAreaListcallback(data){alert(data)}
    $.getJSON("http://d.360buy.com/area/get?fid=" + areaId + "&callback=getAreaListcallback");
      

  3.   


    版主说的对,但是我需要把那个扩展函数放进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");
    }求指教~
      

  4.   

    为什么不使用jQuery自带的getJSON呢?也是支持跨域的,点击查看演示代码function getAreaListcallback(data){
        var items = [];
        $.each(data, function(i,item){
            items[i] = item.id + '=>' + item.name;
        });
        $('body').html(items.join('<br />'));
    }function getInfo(OutId){
        //var areaId = $(OutId).find("#DivId").text();
        var areaId = OutId;
        //alert(areaId);
        var url = 'http://d.360buy.com/area/get?fid=' + areaId + '&callback=?';
        $.getJSON(url, getAreaListcallback);
    }$(function(){
        getInfo(1);
    });
      

  5.   

    你的跨域调用和自带的getJSON是差不多的,而且它们都跟样式没有什么直接关系,是不是你的getAreaListcallback函数的问题,能把这个函数的内容贴出来看看吗?
    不用这段代码的话,会出现样式错乱问题
      

  6.   

    好的。
    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());
                }
            }
        }
    }
      

  7.   


    版主说的对,但是我需要把那个扩展函数放进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");
    }求指教~为什么一定要放函数体里面呢?直接扩展不就好了?而且jquery的jsonp操作只是增加一个script标签到head里面,应该不会影响到你的布局,只可能你后续的操作导致布局错乱
      

  8.   

    因为不放进函数体里,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");
    }
      

  9.   


    理解错了。。以为是代码2放到函数体内。。你确认代码2放入了你的页面了没有?而且getInfo(OutId)再哪里调用的,是不是对象没有生成就调用了导致找不到对象报错什么的,自己用开发工具看下报什么错误
      

  10.   

    代码二一定要放进你的页面去啊,要不$.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");
    }
      

  11.   

    放进去之后,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("");
    }
      

  12.   

    本帖最后由 showbo 于 2014-10-23 14:50:15 编辑
      

  13.   

    原来是要windows作用域,原来我以为调用了jsonp就要把那段扩展函数包进去,才能有效果.
    但是不把原来的代码放到getValue这个函数体内,我怎么才能把外层Div的Id传给getValue呢?我需要通过它来找到store-selector呀?
      

  14.   

    你在原来的基础上直接增加函数就行了吧。。干嘛要包含进去你修改过的那个问题比较多。。会连续触发获取地址的问题,所以你最好在原来的“原始的Html地址选择器”这个重新增加//原始的Html地址选择器原来的代码......
    function getInfo(OutId){
      $.getJSONP("http://d.360buy.com/area/get?fid=" + areaId + "&callback=getAreaListcallback");
    }
      

  15.   

    把你的my_location.js文件里面的代码放到DomReady里面,就可以解决你现在出错的问题,如$(function(){
    //my_location.js现有的代码
    });
      

  16.   

    ”所以你最好在原来的“原始的Html地址选择器”这个重新增加”还是不大明白这句话的意思。。
    我来解释一下为什么要通过外层div来找到这个store-selector,因为我要把这个地址选择器做成.net控件,这样页面调用控件时,一个页面可能有多个控件,这样就有多个store-selector,
      

  17.   

    ”所以你最好在原来的“原始的Html地址选择器”这个重新增加”还是不大明白这句话的意思。。
    我来解释一下为什么要通过外层div来找到这个store-selector,因为我要把这个地址选择器做成.net控件,这样页面调用控件时,一个页面可能有多个控件,这样就有多个store-selector,引发事件冲突,都同时弹出选择器了
      

  18.   


    你压缩包里面不是有2个demo,一个是”原始的Html地址选择器“这个啊,你的另外一个也是居于这个修改的吧。。另外一个我这里测试会重复加载数据,所以修改的有问题。。你要重新在”原始的Html地址选择器“这个进行修改,增加的函数,记得不要再将location.js的内容全部移动到你的函数内容如果有多个控件,你需要自己做成jquery插件的形式了,楼主自己先研究下了。。我看有空了再帮你看看。。~
      

  19.   

    帮你改了下,jquery仿京东商城三级联动代码插件