高分求助大侠帮忙改段代码 jqueryjsonpcallbackjavascriptjs 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 用这个$.getScript("http://d.360buy.com/area/get?fid=" + areaId + "&callback=getAreaListcallback"); 放代码2的函数一定要先执行才能执行代码1,应为1调用的方法是代码2中扩展的,如果那个函数没有执行当然无法找到getJSONP方法jquery默认就支持jsonp了function getAreaListcallback(data){alert(data)}$.getJSON("http://d.360buy.com/area/get?fid=" + areaId + "&callback=getAreaListcallback"); 版主说的对,但是我需要把那个扩展函数放进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自带的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);}); 你的跨域调用和自带的getJSON是差不多的,而且它们都跟样式没有什么直接关系,是不是你的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()); } } }} 版主说的对,但是我需要把那个扩展函数放进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里面,应该不会影响到你的布局,只可能你后续的操作导致布局错乱 因为不放进函数体里,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)再哪里调用的,是不是对象没有生成就调用了导致找不到对象报错什么的,自己用开发工具看下报什么错误 代码二一定要放进你的页面去啊,要不$.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");} 放进去之后,firebug显示出错原因为:getAreaListcallback is not defined我把源码都放网盘里下载:点击这里供下载//getAreaListcallbackfunction 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()); } } }}//getAreaListfunction 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("");} 本帖最后由 showbo 于 2014-10-23 14:50:15 编辑 原来是要windows作用域,原来我以为调用了jsonp就要把那段扩展函数包进去,才能有效果.但是不把原来的代码放到getValue这个函数体内,我怎么才能把外层Div的Id传给getValue呢?我需要通过它来找到store-selector呀? 你在原来的基础上直接增加函数就行了吧。。干嘛要包含进去你修改过的那个问题比较多。。会连续触发获取地址的问题,所以你最好在原来的“原始的Html地址选择器”这个重新增加//原始的Html地址选择器原来的代码......function getInfo(OutId){ $.getJSONP("http://d.360buy.com/area/get?fid=" + areaId + "&callback=getAreaListcallback");} 把你的my_location.js文件里面的代码放到DomReady里面,就可以解决你现在出错的问题,如$(function(){//my_location.js现有的代码}); ”所以你最好在原来的“原始的Html地址选择器”这个重新增加”还是不大明白这句话的意思。。我来解释一下为什么要通过外层div来找到这个store-selector,因为我要把这个地址选择器做成.net控件,这样页面调用控件时,一个页面可能有多个控件,这样就有多个store-selector, ”所以你最好在原来的“原始的Html地址选择器”这个重新增加”还是不大明白这句话的意思。。我来解释一下为什么要通过外层div来找到这个store-selector,因为我要把这个地址选择器做成.net控件,这样页面调用控件时,一个页面可能有多个控件,这样就有多个store-selector,引发事件冲突,都同时弹出选择器了 你压缩包里面不是有2个demo,一个是”原始的Html地址选择器“这个啊,你的另外一个也是居于这个修改的吧。。另外一个我这里测试会重复加载数据,所以修改的有问题。。你要重新在”原始的Html地址选择器“这个进行修改,增加的函数,记得不要再将location.js的内容全部移动到你的函数内容如果有多个控件,你需要自己做成jquery插件的形式了,楼主自己先研究下了。。我看有空了再帮你看看。。~ 帮你改了下,jquery仿京东商城三级联动代码插件 js 判断文本框输入重复值... prototype.js 的create方法? JavaScript如何一下触发两个事件 请教高手js问题,急急 DIV层移动并随滚动条滚动和居中定位(兼容IE和FF)-----和大家共享 离开一个已经选中的radio触发什么事件? 用showModalDialog打开一个窗口,如果在关闭这窗口时刷新父窗口? javascript中如何实现页面提交后仍继续处理? 怎么可以先获得图片尺寸加载后才跳转??? 如何得知浏览器被关闭 菜鸟求助,无框架页面,怎么调用另外一个页面的方法,请高手指点.... iframe子页调用父页的函数,为什么无法调用
$.getJSON("http://d.360buy.com/area/get?fid=" + areaId + "&callback=getAreaListcallback");
版主说的对,但是我需要把那个扩展函数放进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");
}求指教~
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);
});
不用这段代码的话,会出现样式错乱问题
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());
}
}
}
}
版主说的对,但是我需要把那个扩展函数放进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里面,应该不会影响到你的布局,只可能你后续的操作导致布局错乱
由于做成.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)再哪里调用的,是不是对象没有生成就调用了导致找不到对象报错什么的,自己用开发工具看下报什么错误
代码结构一定要这样!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");
}
我把源码都放网盘里下载:点击这里供下载//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("");
}
但是不把原来的代码放到getValue这个函数体内,我怎么才能把外层Div的Id传给getValue呢?我需要通过它来找到store-selector呀?
function getInfo(OutId){
$.getJSONP("http://d.360buy.com/area/get?fid=" + areaId + "&callback=getAreaListcallback");
}
//my_location.js现有的代码
});
我来解释一下为什么要通过外层div来找到这个store-selector,因为我要把这个地址选择器做成.net控件,这样页面调用控件时,一个页面可能有多个控件,这样就有多个store-selector,
我来解释一下为什么要通过外层div来找到这个store-selector,因为我要把这个地址选择器做成.net控件,这样页面调用控件时,一个页面可能有多个控件,这样就有多个store-selector,引发事件冲突,都同时弹出选择器了
你压缩包里面不是有2个demo,一个是”原始的Html地址选择器“这个啊,你的另外一个也是居于这个修改的吧。。另外一个我这里测试会重复加载数据,所以修改的有问题。。你要重新在”原始的Html地址选择器“这个进行修改,增加的函数,记得不要再将location.js的内容全部移动到你的函数内容如果有多个控件,你需要自己做成jquery插件的形式了,楼主自己先研究下了。。我看有空了再帮你看看。。~