我是AJAX的新手,也有Java / Jquery的经验。我一直在寻找解决我的问题但我似乎无法找到任何解决方案。
我正在尝试在网上商店中构建一个功能,产品将显示在弹出窗口中,而不是加载新页面。
我使用此代码使其工作:
$(".product-slot a").live('click', function() {
var myUrl = $(this).attr("href") + " #product-content";
$("#product-overlay-inner").load(myUrl, function() {
});
$("#product-overlay").fadeIn();
return false;
});
product-slot a =链接到类别页面中的产品
product-content =我想在产品页面的弹出窗口中插入的div
product-overlay-inner =弹出窗口。
product-overlay =弹出包装器。
我现在遇到的问题是我的Javascript / Jquery不在productpopup中工作。例如,产品图像的灯箱或将产品添加到shoppingcart的按钮不起作用。反正有没有让javascript在加载的内容中工作或者将javascript加载到弹出窗口中?
我希望你能理解我的问题是什么!
提前谢谢!
编辑:我正在使用的平台有jquery-ui-1.7.2
答案 0 :(得分:1)
我知道这是一个旧帖子,但我一直在使用相同的脚本加载问题处理类似的过程,并认为我将我的版本作为另一个选项共享。
我有一个基本的路由处理程序,用于当用户点击我用来换掉网站主要内容区域的锚点/按钮等时,在这个例子中它是" .page&#34 ;类。
然后我使用函数进行ajax调用以获取html内容作为部分,目前它们是php文件,并且他们做了一些初步渲染服务器端来构建html但是这不是必需的。
回调处理放置新的html,因为我知道我需要什么脚本,我只需将它附加到动态创建的脚本标记的底部。如果我在服务器上有错误,我将其作为内容传回去,这可能只是一个关键词,我可以用来触发自定义js方法来打印更有意义的页面。
这是基于注册路由处理程序的基本实现:
var register = function(){
$(".page").html("");
// use the getText ajax function to get the page content:
getText('partials/register.php', function(content) {
$(".page").html(content);
var script = document.createElement('script');
script.src = "js/register.js";
$(".page").append(script);
});
};
/******************************************
* Ajax helpers
******************************************/
// Issue a Http GET request for the contents of the specified Url.
// when the response arrives successfully, verify it's plain text
// and if so, pass it to the specified callback function
function getText(url, callback) {
var request = new XMLHttpRequest();
request.open("GET", url);
request.onreadystatechange = function() {
// if the request is complete and was successful -
if (request.readyState === 4 && request.status === 200) {
// check the content type:
var type = request.getResponseHeader("Content-Type");
if (type.match(/^text/)) {
callback(request.responseText);
}
}
};
// send it:
request.send(null); // nothing to send on GET requests.
}
我发现这是一个很好的方式来模块化'我的代码分为部分视图和分离的JavaScript文件,可以轻松地在页面内/外交换。 我将努力使这个更加动态,甚至缓存这些模块'在SPA场景中重复使用。
我对网络开发相对较新,所以如果你能看到任何问题,或者更安全/更好的方式,我全心全意:)
答案 1 :(得分:0)
是的,您可以从动态页面加载Javascript,但不能加载load()
,因为load
会删除任何Javascript并插入原始HTML。
解决方案:使用get
下拉原始页面并重新附加任何Javascript块。
道歉,这是在Typescript中,但你应该明白(如果有的话,强类型的TypeScript比普通的Javascript更容易阅读):
_loadIntoPanel(panel: JQuery, url: string, callback?: { (): void; })
{
// Regular expression to match <script>...</script> block
var re = /<script\b[^>]*>([\s\S]*?)<\/script>/gm;
var scripts: string = "";
var match;
// Do an async AJAX get
$.ajax({
url: url,
type: "get",
success: function (data: string, status: string, xhr)
{
while (match = re.exec(data))
{
if (match[1] != "")
{
// TODO: Any extra work here to eliminate existing scripts from being inserted
scripts += match[0];
}
}
// Replace the contents of the panel
//panel.html(data);
// If you only want part of the loaded view (assuming it is not a partial view)
// using something like
panel.html($(data).find('#product-content'));
// Add the scripts - will evaluate immediately - beware of any onload code
panel.append(scripts);
if (callback) { callback(); }
},
error: function (xhr, status, error)
{
alert(error);
}
});
}
它会像:
var _loadFormIntoPanel = function (panel, url, callback) {
var that = this;
var re = /<script\b[^>]*>([\s\S]*?)<\/script>/gm;
var scripts = "";
var match;
$.ajax({
url: url,
type: "get",
success: function (data, status, xhr) {
while(match = re.exec(data)) {
if(match[1] != "") {
// TODO: Any extra work here to eliminate existing scripts from being inserted
scripts += match[0];
}
}
panel.html(data);
panel.append(scripts);
if(callback) {
callback();
}
},
error: function (xhr, status, error) {
alert(error);
}
});
};
$(".product-slot a").live('click', function() {
var myUrl = $(this).attr("href") + " #product-content";
_loadFormIntoPanel($("#product-overlay-inner"), myUrl, function() {
// Now do extra stuff to loaded panel here
});
$("#product-overlay").fadeIn();
return false;
});