【问题标题】:Passing site properties with javascript使用 javascript 传递站点属性
【发布时间】:2012-10-26 12:04:15
【问题描述】:

所以我有点想出一种转变方式来做网站属性,但我想知道是否有办法改进我的方法。目标是拥有 1 个 html 文件,我的客户将能够在其中使用 cms 工具并更新网站上的常见值,例如重复的标题、感谢消息、公司名称等。我想使用 Javascript 来完成此操作。

var spSelectResultsTxt = $("#sp .selectResultsTxt");
$(".main-content .selectResultsTxt").text(spSelectResultsTxt.text());​

这是一个活跃的小提琴,http://jsfiddle.net/trobbins26/VwtWD/4/

脚本将文本值从一个 div(客户端将在 cms 中更新)传递到站点中某个页面上的类。唯一的问题是我不想为网站上可能存在的每个属性创建一个 var。

我的脚本中有没有办法说[如果#sp .class 与.main-content .class 匹配,则将#sp .class 中的文本应用为.main-content .class 中的文本?本质上是创建一个可以应用于我创建的每个属性的规则。

任何反馈都会有所帮助。

【问题讨论】:

    标签: javascript jquery html properties jquery-selectors


    【解决方案1】:

    这样就可以了:

    HTML:

    <!-- Represents html file that will be updated in a cms by client -->
    <!-- To be included on each page of site -->
    <div id="sp" style="display:none;">
        <span data-target=".main-content .selectResultsTxt">
            Select an option to see results for a specific year.    
        </span>
        <div data-target="#otherText">Some other text.</div>
    </div>
    
    
    <!-- represents page to apply rule -->
    <div class="main-content">
        <h4><span class="selectResultsTxt"></span> testing...</h4>
        <p><span id="otherText"></span></p>
    </div>
    

    Javascript:

    $('#sp').children().each(function() {
        $($(this).data().target).text($(this).text());
    });
    

    在这里更新小提琴:http://jsfiddle.net/VwtWD/7/

    解释:

    您只需遍历div.sp 的子元素,然后访问其类和文本并在页面上寻找匹配的元素进行更新。

    我做了一些改进:

    最好留下用于识别目标元素的类,并在存储用户输入文本的元素上使用数据绑定。就像我上面的解决方案一样,可以通过 jQuery .data() 函数轻松访问它。

    如果能够为每个元素指定完整的 CSS 路径,那也很不错,这样您就可以将解决方案扩展到更复杂的页面。

    我个人也会使用.html()方法来设置html,而不仅仅是文本,以防客户端想要使用&lt;br&gt;标签或&lt;em&gt;&lt;img&gt;等。示例:

    $('#sp').children().each(function() {
        $($(this).data().target).html($(this).html());
    });
    

    其他反馈:

    您是否有理由使用客户端 javascript 来实现这一目标?您可以很容易地在服务器端执行此操作(即使在带有 node.js 的 javascript 中),这将有很多好处,包括 - 谷歌等不会看到对 SEO 有问题的内容 - 没有 javascript 的浏览器将看不到内容(诚然,这是一个非常小的数字,因此可能不是问题,但值得指出)

    无论如何,作为一种快速破解解决方案,它是有效的。

    【讨论】:

    • 谢谢!我会让你知道这是如何工作的。最终,如果有更好的解决方案 id 喜欢这里,但我的服务器将我限制为 Javascript,如果我不需要的话,我不是 PHP 编码的忠实粉丝。 Freemarker 将是理想的,但同样......我有服务器限制。
    • 这成功了!谢谢你。总的来说,我想改进我的方法,但这将取决于我当前的项目。对代码的良好反馈。这很有帮助。
    • 有没有一种简单的方法来更新它以解决文本以外的问题?例如,如果我在数据目标范围内有一个链接,并希望将它包含在传递给类的文本中。
    • 是的;只需将text() 方法调用替换为html() 方法调用即可。我在上面添加了另一个示例。这会将所有文本和 html 标签复制到目标元素中。如果您在文档加载时使用 jQuery(例如 $(a).click(...))绑定任何其他行为,请确保您在上述代码之后执行此操作,因为不会复制事件处理程序。
    • 随着我更多地使用我的 CMS 工具,我注意到这种方法可能会出现一些并发症。我想知道是否不是将数据目标传递给跨度,是否有办法替换页面上以值“sp”开头的任何文本。并具有匹配的属性。例如,

      sp.someSiteProperty

      ,其中“someSiteProperty 在我的 siteproperties.html 中定义。有什么想法吗?
    【解决方案2】:

    这样的事情应该做你想做的事。 它将按顺序遍历所有具有类的元素。如果一个元素有多个类,它将匹配具有所有相同类的元素。它不会过滤重复项,因此如果一个元素被多次匹配,最后一次匹配会覆盖之前的所有匹配项。

    // save main element
    var main = $( '.main-content' );
    
    // for each element in #sp with a class
    $( '#sp *[class]' ).each( function() {
        // get all the classes on the element, and make a jQuery selector from them
        var selector = '.' + this.getAttribute( 'class' ).replace( ' ', '.' );
    
        // find any matching elements in the main element, and set the text
        main.find( selector ).text( $( this ).text() );
    });
    

    编辑:这是一个演示:http://jsfiddle.net/VwtWD/6/

    【讨论】:

    • 好主意,但在某些情况下,我需要在页面上多次重用该类,因为该属性可以存在多次。
    猜你喜欢
    • 1970-01-01
    • 2021-05-24
    • 1970-01-01
    • 2012-01-31
    • 2020-11-02
    • 2012-08-12
    • 1970-01-01
    • 1970-01-01
    • 2012-03-31
    相关资源
    最近更新 更多