我正在尝试将JQuery与一些使用母版页的asp.net页面一起使用,而且我在加载JQuery javascript文件时遇到了问题。
当我将文件包含在母版页的标记中时,它可以在与母版页位于同一目录中的页面上正常工作:
<script src="jquery/jquery-1.4.2.min.js" type="text/javascript"></script>
但是对于与母版页不在同一目录中的页面会中断。母版页继承包含它们的页面的路径,因此对于不同的页面,jquery .js文件的相对路径是不同的。当然,我在主文件中不能有不同的相对路径,因为它们只有一个。
我可以使用绝对路径:
<script src="/jquery/jquery-1.4.2.min.js" type="text/javascript"></script>
但如果网站安装为虚拟目录,则会中断。
我的下一次尝试是使用“〜”来表示网站的根目录:
<script src="~/jquery/jquery-1.4.2.min.js" type="text/javascript"></script>
但脚本标签不理解〜“。
所以我试着在代码隐藏中做到这一点。从OnInit()开始,我试过了:
string url = "~/jquery/jquery-1.4.2.min.js";
url = this.ResolveUrl(url);
Page.ClientScript.RegisterClientScriptInclude("jquery_js", url);
当JQuery javascript运行时,这会给我带来错误。我在页面的标记中有一些javascript:
$(document).ready(function()
{
...
}
我得到“$”未定义。我在jquery-1.4.2.min.js的开头添加了一个警报,并且它正在加载,但在.aspx文件中的这个javascript执行完毕后。
我尝试使用ScriptManager.RegisterClientScriptInclude(),但结果相同。
答案 0 :(得分:5)
您可以使用:
<script type="text/javascript" src="<%= ResolveUrl("~/jquery/jquery-1.4.2.min.js")%>"></script>
或者可能构建一个主要为您重新映射的控件:
<my:Script src="~/jquery/jquery-1.4.2.min.js" />
甚至可以使用ClientScriptManager进行注册,但最好将其放在页面中。
答案 1 :(得分:5)
使用谷歌服务你的jquery:
<script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
请注意src属性中缺少http,这将解决http vs https可能出现的任何问题。
原因如下:http://encosia.com/2008/12/10/3-reasons-why-you-should-let-google-host-jquery-for-you/
Ode To Code在Master Pages上有一篇很棒的文章你也应该看看:
答案 2 :(得分:1)
使用Page.ResolveUrl()
所以它相对于 Page ,而不是 MasterPage (以及它所在的控制目录),如下所示:
string url = Page.ResolveUrl("~/jquery/jquery-1.4.2.min.js");
答案 3 :(得分:1)
ResolveUrl是要走的路。
<script src="<%= ResolveUrl("~/scripts/jquery-1.4.4.min.js") %>" type="text/javascript"></script>
答案 4 :(得分:1)
您可以在母版页头中尝试src="<%= Page.ResolveClientUrl("~/jquery.js") %>
。
$<script type="text/javascript" src="<% = Page.ResolveClientUrl("~/scripts/jquery-1.4.1.min.js") %>"></script>
答案 5 :(得分:0)
尝试如下所示
StringBuilder sb = new StringBuilder();
sb.Append("<script type=\"text/javascript\" src=\"");
sb.Append("http://yourwebsitename" + "/" + "directory");
sb.Append("/");
sb.Append("jquery.js");
sb.Append("\"></script>");
Header.Controls.Add(new LiteralControl(sb.toString()));
答案 6 :(得分:0)
使用谷歌是一个很好的选择,但是,你也可以在你遇到问题的每个页面中添加链接(无法找到jquery路径的那些) 例如,如果您在另一个目录中有一个名为“MyPage.aspx”的页面,则只需在页面“MyPage.aspx”页面的html上添加脚本 以这种方式thoes页面找不到你的jquery地址将分别适用于新的 我希望这对你有用
答案 7 :(得分:0)
问题的核心是,使用RegisterClientScriptInclude
注入到页面中的JavaScript文件的链接被放置在依赖于它的标记中的JavaScript代码下面的页面上。
$(document).ready()
中的内容可能在页面加载后才会执行,但$()
会立即执行,因为浏览器会读取它。
解决方案是移动JavaScript以便稍后出现在文件中。当您处理母版页和众多用户控件时,这并不总是如此简单。
对我来说,处理它的最简单方法是使用RegisterStartupScript
从代码隐藏中注入JavaScript。用这个注入的脚本块添加在表单的末尾。其中的可执行语句只有在插入了所有各种JavaScript文件后才会执行。
答案 8 :(得分:0)
不重复你的自我
为您的网页制作扩展功能
public static class yourclass
{
public static string ConvertRelativePathToRootPath(this Page p, string pathfromroot)
{
string newUrl = "";
Uri originalUri = HttpContext.Current.Request.Url;
newUrl = (originalUri.Scheme) + "://" + originalUri.Authority + pathfromroot;
return newUrl;
}
}
然后只需将以下代码添加到您的页面加载事件
string ss = Page.ConvertRelativePathToRootPath("~/script/jquery-1.4.1.min.js");
ScriptManager.RegisterClientScriptInclude(this, this.GetType(), "Jquery", ss);
你也可以使用上面的扩展功能,除了你的应用程序母版页根之外,还需要在文件上使用像图像或锚标记这样的绝对路径 :)