我尝试搜索类似的问题,但没有一个与我所处的困境相匹配......所以,首先,如果我的搜索不成功,很抱歉。
项目背景:我正在用Joomla建一个旅游指南网站!+ SEBLOD + Youtheme Warp。度假村的注册用户/所有者可以将他们的业务添加到列表中,但他们需要广告位置。由于有许多州,后来有许多海滩要链接到,所以想法是按地区过滤位置(5 个地区,来自 Region 类别的 SEBLOD/Joomla 文章 > 州(来自 State 类别的 SEBLOD/Joomla 文章,通过SEBLOD 相关文章字段到地区)> 海滩(SEBLOD/Joomla 内容类型,通过 SEBLOD 相关文章字段链接到州和地区),从而减少了选择中的列表选项。
我的问题是:选择是从有效的 JQuery/Ajax 函数填充的,但是在 3 次执行之后,它停止工作。
我在 Firefox 上使用 Firebug(因为它在“离线”时工作。在 localhost 上运行)和 WebDeveloper 扩展。
我收到以下 JS 错误:错误 1 - 来自 webdeveloper(似乎与 Yootheme Warp 有关):
Timestamp: 13/07/2012 12:55:45
Error: TypeError: $.onMediaQuery is not a function
Source File: http://localhost/viapraia2/templates/yoo_master/js/template.js
Line: 37
错误 2 - 来自萤火虫((似乎与 Yootheme Warp 有关,但不确定是否与上述相同)
TypeError: $.onMediaQuery is not a function
invalid: function() {
我认为这些错误与我的问题无关,尽管 Yootheme Warp 警告正在加载多个 JQuery 库。我检查了文件,扩展名似乎是单独封装自己的,所以它们不应该冲突,但我不能确定。由于脚本工作了几次,我认为它们与问题无关......
这就是我认为相关的JS:
/**
* Check if RESORT select object exists and has value
**/
var resort = $j('#vp_related_resort');
var resortValue = (resort.length <0) ? 0 : resort.val();
var resortCatId = (isEmpty($j('#vp_resort_catid'))) ? 0 : $j('#vp_resort_catid').val();
var arrKeys = ['region', 'state', 'related_beach','resort'];
var varArr = [region, state, beach, resort];
mySelects={
'region':{'select':region,'value':regionValue,'catid':regionCatId},
'state':{'select':state,'value':stateValue,'catid':stateCatId},
'related_beach':{'select':beach,'value':beachValue,'catid':beachCatId},
'resort':{'select':resort,'value':resortValue,'catid':resortCatId}
};
/**
* Set AJAX request to retrieve STATES according to the REGION selected
* Change the STATES select content according to the result
**/
function _ajax(ajaxUrl,value,item,obj){
var nUrl = (item.match(/beach/)) ? '&item=beach' : '&item=' + item;
nUrl = ajaxUrl + nUrl;
$j.ajax ({
url: nUrl,
contentType: "application/json;charset=UTF-8",
success: function(data){
if(data.length) {
$j.each(data,function(c,d){
var o = new Option();
var newTitle = d.title;
$j(o).html(newTitle).val(d.id);
obj.append(o);
//obj.val(value);
});
}
},
beforeSend: function(){
obj.children("option:not(:first)").remove();
obj.hide();
},
complete:function(){
nUrl = ajaxUrl = '';
obj.show();
},
dataType: 'json',
});
}
/**
* Execute _ajax function when region SELECT changes
**/
region.change(function(){
var aUrl = theUrl;
if($j(this).val() > 0){
var w = arrKeys.indexOf('region');
var kArr = arrKeys;
kArr.splice(w,1);
var vArr = varArr;
vArr.splice(w,1);
aUrl = aUrl + 'region®ionSelectId=' + $j(this).val() + '®ionCatId=' + mySelects.region.catid + '&catid=';
for(var i=0; i < kArr.length; i++){
var v = 0;
if(vArr[i].length > 0) {
v = aUrl + mySelects[kArr[i]].catid;
_ajax(v, mySelects[kArr[i]].catid,kArr[i],vArr[i]);
}
}
}
});
可以通过在此处以 user/testuser 身份登录,然后加载此表单 进行测试选择出来。我不知道从哪里开始寻找错误。
感谢您的时间!!
[更新] - [已解决] 在昨天花了几个小时(并且失眠!!)和今天,我终于找到了问题所在。这绝对是对 splice 和 indexOf 方法的滥用。我替换了 region.change 函数来循环键和对象数组,并且仅当循环项与选择对象本身的处理值不同时才执行 ajax 调用。
如果有人关心,这是更新版本:
/**
* Execute _ajax function when region SELECT changes
**/
region.change(function(){
var aUrl = theUrl;
var k = $j(this).attr('id').replace('vp_','');
if($j(this).val() != 0){
aUrl = aUrl + 'region®ionSelectId=' + $j(this).val() + '®ionCatId=' + mySelects.region.catid + '&catid=';
for(var i=0; i < kArr.length; i++){
var v = '';
if(kArr[i] != k) {
v = aUrl + mySelects[kArr[i]].catid;
_ajax(v, mySelects[kArr[i]].catid,kArr[i],vArr[i]);
}
}
}
});