【问题标题】:changing img src with JQuery but leave pathing info intact?用 JQuery 更改 img src 但保持路径信息完好无损?
【发布时间】:2010-03-17 18:32:08
【问题描述】:

我正在使用 JQuery 来切换图像 src:

$("#myImg").attr("src", "../../new.gif");

注意新 src 上的相对路径。不幸的是,当我部署我的应用程序时,这不是可移植的。在我的 MVC 应用程序中,我使用了 ResolveUrl() 方法,该方法将为我解决路径问题,因此它是可移植的,但现在我的 JQuery 图像 src 交换器无法正常工作,因为它现在将正确解析的路径切换到损坏的相对路径.

<img id="myImg" src="<%=ResolveUrl("~/Images/transparent.gif")%>" />

我想要的是让 JQuery 只翻转实际文件名并保持路径不变。我的第一个想法是

// pseudocode javascript jquery on my thought on how to approach this prob
var oldFullPath = $('#myImg").GetTheImgSrc;
var newFileNameWithPathIntact = someRegexAddNewFileNameWithOldPath
$("#myImg").attr("src", newFileNameWithPathIntact);

但这对我来说似乎相当粗俗和非 JQuery。谁有更好的方法?

【问题讨论】:

    标签: javascript jquery model-view-controller


    【解决方案1】:

    你可以使用这样的东西:

    var oldImage =$("#myImg").attr("src");
    var imagePath = oldImage.slice(0, oldImage.lastIndexOf("/")) + "/new.gif";
    $("#myImg").attr("src", imagePath ); 
    

    编辑:更好的代码...:)

    【讨论】:

    • 这是我的问题的最佳解决方案。代码 sn-p 的小问题:如果您在第一行破解 val() 它将起作用。显然,如果您只提供一个参数,JQuery attr() 将返回一个 val
    • 是的,我的错,打字太快了 :) 正在为此编辑。
    【解决方案2】:

    您可以在 javascript 中使用 resolveurl:

    $("#myImg").attr("src", "<%=ResolveUrl("~/Images/new.gif")%>");
    

    这当然假设您已经在视图中包含了 javascript。如果您要求此脚本必须位于与 html 请求不同的脚本文件中,那么您可以只查看 is javascript 文件的视图...并在脚本中引用该 URL来源:

    <script language="javascript" src="<%= Url.Action("MyMethod") %>" />
    

    【讨论】:

    • 我知道在 WebForms 中设计者不会很好地处理这一点,可能会给你警告,但它非常有效,我一直在我的脚本中使用它来注入讨厌的 clientId。 +1
    • 虽然我没有要求将此 js 方法放在单独的文件中,但它被多个视图调用,因此在单个位置显然更好。我不理解您将视图设为 js 文件的第二个选项。能否提供更多细节?
    • 好的,我的意思是制作一个动作方法,称为“脚本”(例如)。然后在“Script.aspx”视图中,您可以简单地编写 javascript(以及如上所述的动态元素)。最后,通过将您的操作方法的 URL 放入脚本的 src 属性中,浏览器将请求并执行您的操作方法。
    • 这很酷。对于我想要完成的事情来说,这似乎有点重量级,但我喜欢它作为一种通用策略。
    【解决方案3】:

    为什么不将变量用于可用于这些类型情况的应用的根目录。

    var root = "<%=ResolveUrl("~/") %>";
    

    现在您可以轻松构建图像路径

    $("#myImg").attr("src", root + "images/" + fileName);
    

    【讨论】:

    • 问题是,当我将 .js 放在一个单独的文件中时,正确设置这个设置有点像意大利面条......使用 .js 文件的每个页面都需要设置根,不是吗?这似乎是一个维护问题(尽管我喜欢优雅)。还是我错过了什么?
    • 您可以将母版页中的根设置为全局变量。
    • 您不能在母版页中设置根变量,因为如果您最终在 /customer/signup 视图中使用该变量,则全局变量将是 /customer/signup 中的“/” / 它必须是'../../'
    • @Kevin - 这根本不是真的。执行 var = "" 将始终呈现根路径,无论您有多深。
    • @Kevin - 如果您在包含任何其他 .js 文件之前在母版页中设置了 javascript 根,则根变量将是您项目中所有内联或包含的 javascript 的“全局”变量,并且您只需声明一次。
    猜你喜欢
    • 2015-11-18
    • 2014-01-20
    • 2011-05-10
    • 2016-04-17
    • 1970-01-01
    • 2014-11-04
    • 1970-01-01
    • 1970-01-01
    • 2019-07-17
    相关资源
    最近更新 更多