【问题标题】:Need help about a function需要有关功能的帮助
【发布时间】:2013-05-06 15:24:33
【问题描述】:

我是 Javascript 和 jQuery 的新手。我需要以下帮助:

<script type="text/javascript">
    $(window).load(function(){
        $('#createDiv').click(function (){
            $("<div/>").html("<span id='myInstance2' style='display: block;'>New Folder</span>").css("display", "none").appendTo("#results").fadeIn();
        });
    });
</script>

我有这个功能可以点击并创建一个带有文本的新&lt;span&gt; 标签。你可以看到我有一个 ID myInstance2。所以我想做的是当我点击并创建跨度时,我想让这个跨度可以实时编辑。就像我可以将这个“新文件夹”重命名为我想要的任何名称。

如果有人可以提供帮助,那就太好了。在此先感谢并为我的英语不好感到抱歉:)

【问题讨论】:

  • 它现在所做的与您希望它做的有什么不同?
  • style='display: block;'&gt;New Folder&lt;/span&gt;").css("display", "none") 你在这里严重违背了你自己的目的
  • contenteditable 属性添加到跨度。这样就可以了
  • ...不要使用id='myInstance2',而是使用class='myInstance2'
  • 通常跨度是不可编辑的,这就是输入标签的用途。如果您希望它可编辑,则需要添加一些支持该功能的库。请在此处说明您的全部用途。

标签: javascript jquery html css


【解决方案1】:

如果我发现了我认为您正在尝试做的事情,那么这并不像您想象的那样可行。不过,也有窍门。以下是其中之一。这个想法是在跨度所在的位置插入一个“隐藏”输入,然后创建函数来显示输入并在需要时隐藏跨度(例如当用户单击跨度时。像这样:

jsFiddle

HTML

<button id="createDiv">Start</button>
<div id="results"></div>

CSS

#createDiv, #results span { cursor: pointer; }
#results div {
    background: #FFA;
    border: 1px solid;
    margin: 1em;
    padding: 1em 1em 2em;
}
#results input[type=text] {
    border: none;
    display: none;
    outline: none;
}

JavaScript

//  Call for document .onload event
$(function() {
    //  Normal Click event asignement, same as $("#createDiv").click(function
    $("#createDiv").on("click", function(e) {
        //  Simply creating the elements one by one to remove confusion
        var newDiv = $("<div />", { class: "new-folder" }),  //  Notice, each child variable is appended to parent
            newInp = $("<input />", { type: "text", value: "New Folder", class: "title-inp" }).appendTo(newDiv),
            newSpan = $("<span />", { id: "myInstance2", text: "New Folder", class: "title-span" }).appendTo(newDiv);
        //  Everything created and seated, let's append this new div to it's parent
        $("#results").append(newDiv);
    });

    //  the following use the ".delegate" side of .on
    //  This means that ALL future created elements with the same classname, 
    //    inside the same parent will have this same event function added
    $("#results").on("click", ".new-folder .title-span", function(e) {
        //  This hides our span as it was clicked on and shows our trick input, 
        //    also places focus on input
        $(this).hide().prev().show().focus();
    });
    $("#results").on("blur", ".new-folder .title-inp", function(e) {
        //  tells the browser, when user clicks away from input, hide input and show span
        //    also replaces text in span with new text in input
        $(this).hide().next().text($(this).val()).show();
    });
    //  The following sures we get the same functionality from blur on Enter key being pressed
    $("#results").on("keyup", ".new-folder .title-inp", function(e) {
        //  Here we grab the key code for the "Enter" key
        var eKey = e.which || e.keyCode;
        if (eKey == 13) { // if enter key was pressed then hide input, show span, replace text
            $(this).hide().next().text($(this).val()).show();
        }
    });
})

【讨论】:

  • 完美而准确地满足我的需要。数以百万计的感谢
  • 你给我的例子是超级的。我正在考虑添加一些额外的东西。就像如果重命名完成并且同名出现两次一样,它可以发出警告并给机会再次重命名。像“你给的名字请选择不同的名字”这样的警告,这对我的项目来说是完美的。在此先感谢 一切顺利
【解决方案2】:

您可以做的是在 span 将驻留的封闭静态元素上放置一个委托事件处理程序 #results。处理程序将隐藏span 并显示input。我不太了解您的代码,但您可能想要input 上的 id 而不是跨度。你没有说你想从可编辑回到“只读”,所以我没有这样做。

DEMO

    $('#createDiv').on('click', function () {
        var str = "Click here to edit it";  // New Folder
        $("<div/>").html("<span id='myInstance2' class='editToggler' style='display: block;'>" + str + "</span><input class='editToggler' style='display: none' value='" + str + "'/>").appendTo("#results").fadeIn();
        $(this).off('click');
    });



    $('#results').on('click', 'span', function () {
        $('.editToggler').toggle();
    });

【讨论】:

    【解决方案3】:

    这应该有效并且比其他答案(imo)简单得多:

    <script type="text/javascript">
      $(window).load(function(){
          $('#createDiv').click(function (){
            $("<div />").html("<span onclick='$(this).html(prompt(\"Rename \"+$(this).html()))' id='myInstance2' style='display: block; cursor:pointer;'>New Folder</span>").css("display", "none").appendTo("#results").fadeIn();
          });
      });
    </script>
    

    当您单击span 时,系统会提示您输入新名称。为了直观地表示您创建的span 是可点击的,我还在span 的样式中添加了cursor:pointer

    演示:http://jsfiddle.net/XJ6Cn/

    编辑:P.S:您是否使用此方法创建了多个span?如果是这样,您应该动态创建ids,因为ids 是唯一的。如果您希望所有spans 的字符串都相同,则可以将其设置为class

    【讨论】:

    • 非常感谢,这正是我所期待的 :)
    • 还有没有办法在不创建弹出窗口的情况下重命名?谢谢
    • 我在示例中使用了一个弹出窗口,因为我不知道您究竟想如何编辑它。如果您想使用输入元素,可以使用他的答案中发布的代码 SpYk3HH。
    • 在我看来这很糟糕。内联回调创造了代码维护的噩梦。 prompt 也是您要避免的,因为它会锁定导航,包括切换到另一个选项卡并要求与之交互。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-05
    相关资源
    最近更新 更多