2010-12-01 33 views
2

我正在尝试在一些使用母版页的asp.net页面上使用JQuery,而我在加载JQuery JavaScript文件时遇到了问题。在ASP.NET中使用MasterPage的JQuery

当我包括母版页的标记文件,它工作得很好对在同一个目录中的母版页页:

<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); 

这一点让我的错误时运行的JavaScript JQuery的我有一些JavaScript页面的标记:

$(document).ready(function() 
{ 
    ... 
} 

我得到的“$”未定义。我在开始的jquery-1.4.2.min.js中添加了一个警报,并且它正在加载OK,但在.aspx文件中的这一点javascript已经执行之后。

我试过ScriptManager.RegisterClientScriptInclude(),结果相同。

+0

上一个示例实际生成的HTML是什么?包含您的$(document).ready处理程序的脚本标记是否包含它? – Goyuix 2010-12-02 00:07:25

+0

不是。这就是问题所在。 (或者最后一个问题,如果不是主页面的话,我可以把链接放在脚本之前,添加代码隐藏的链接并不能让我控制它们的放置位置 – 2010-12-02 21:19:25

回答

0

问题的核心是链接到正在被注入页面的JavaScript文件RegisterClientScriptInclude正在放置在依赖于标记的JavaScript代码下方的页面上。

$(document).ready()中的内容在加载页面之后才能执行,但$()会立即执行,因为它被浏览器读取。

该解决方案将JavaScript移到稍后显示在文件中。当你处理主页面和众多的用户控件时,并不总是那么简单。

对我来说,处理它的最简单方法是从代码隐藏中注入JavaScript,使用RegisterStartupScript。与此注入的脚本块添加在窗体的末尾。只有在插入了所有各种JavaScript文件后,它们中的可执行语句才会执行。

1

使用Page.ResolveUrl()所以它是相对于,而不是母版(和它在控制目录),如:

string url = Page.ResolveUrl("~/jquery/jquery-1.4.2.min.js"); 
5

你既可以使用:

<script type="text/javascript" src="<%= ResolveUrl("~/jquery/jquery-1.4.2.min.js")%>"></script> 

或者可能建立一个控制,其中essentialy为您重新映射:

<my:Script src="~/jquery/jquery-1.4.2.min.js" /> 

甚至将它注册到ClientScriptManager中,但最好将它放在页面中。

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())); 
1

RESOLVEURL是要走的路。使用

<script src="<%= ResolveUrl("~/scripts/jquery-1.4.4.min.js") %>" type="text/javascript"></script> 
0

谷歌是一个不错的选择ofcourse但是,你也可以添加你在每个页面的链接你有问题(thoes无法找到路径的jQuery) 举例来说,如果你有一个页面在其他目录中称为“MyPage.aspx”只是添加在页面“MyPage.aspx”的HTML脚本相对 以这种方式thoes页面无法找到您的jQuery地址将与新的一个罚款 我希望适用于你

+2

整个在主页面放置jquery.js链接的目的是让我不必在每个页面中分别放置它。DRY是一个基本的设计原则,在您的危险中被违反。 – 2010-12-02 04:56:01

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); 

,你也可以使用以上扩展功能的所有其他需要一个绝对路径像图像或定位标记在您的文件与除应用程序主页页面以外的路径根 :)

1

您可以在母版页头中尝试src="<%= Page.ResolveClientUrl("~/jquery.js") %>

$<script type="text/javascript" src="<% = Page.ResolveClientUrl("~/scripts/jquery-1.4.1.min.js") %>"></script>