不使用innerHTML替换dhtml元素

发布于 2024-08-18 13:39:12 字数 1165 浏览 9 评论 0原文

这看起来应该很容易。我有一个 html 片段,我希望通过 javascript 找到并修改它。但不仅仅是innerHTML;我想替换整个元素。示例:

  <div class="content">
    <div class="item">
      <img src="images/pic1.jpg" />
      <a class="clicker" onclick="javascript:doSomethingUseful(##);">Do ##!</a>
      <h3>title</h3>
      <p>description</p>
    </div>
  </div>

页面加载后,我想获取 Now! 并将其替换为三个实例,例如:

  <div class="content">
    <div class="item">
      <img src="images/pic1.jpg" />
      <a class="clicker" onclick="javascript:doSomethingUseful(1);">Do 1!</a>
      <a class="clicker" onclick="javascript:doSomethingUseful(2);">Do 2!</a>
      <a class="clicker" onclick="javascript:doSomethingUseful(3);">Do 3!</a>
      <h3>title</h3>
      <p>description</p>
    </div>
  </div>

使用prototype.js ,我可以轻松执行 $$('.clicker') 并获取包含该元素的数组。我可以使用 .innerHTML 并获得“Do ##!”并改变它。但我想要,不,需要整个元素才能将其插入到位。我可以经历兄弟姐妹和父母的奇怪阴谋,然后绕着节点走回去,最终得到我需要的东西,我会这么做。看来我在这里缺少一些可以让这变得容易的东西。

This seems like it should be easy. I have a html snippet that I wish to locate and modify in place via javascript. But not just the innerHTML; I want to replace the entire element. Example:

  <div class="content">
    <div class="item">
      <img src="images/pic1.jpg" />
      <a class="clicker" onclick="javascript:doSomethingUseful(##);">Do ##!</a>
      <h3>title</h3>
      <p>description</p>
    </div>
  </div>

After page load, I want to grab the <a class="clicker" ...>Now!</a> and replace it with three instances like:

  <div class="content">
    <div class="item">
      <img src="images/pic1.jpg" />
      <a class="clicker" onclick="javascript:doSomethingUseful(1);">Do 1!</a>
      <a class="clicker" onclick="javascript:doSomethingUseful(2);">Do 2!</a>
      <a class="clicker" onclick="javascript:doSomethingUseful(3);">Do 3!</a>
      <h3>title</h3>
      <p>description</p>
    </div>
  </div>

Using prototype.js, I can easily do $$('.clicker') and get an array with the element. I can use .innerHTML and get the 'Do ##!' and change it. But I want, nay, need the entire element to insert it in place. I can go through weird machinations of siblings and parent, and walk back around the nodes to eventually get what I need, and I will do that. It just seems that I am missing something here that would make this easy.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

删除会话 2024-08-25 13:39:12

如果它不是您想要在页面中运行的唯一 HTML 生成,您可以考虑使用 javascript 模板引擎。
有几个优点,主要的一个是 HTML 视图和 JS 逻辑之间的明确划分。

有很多这样的引擎可以满足各种口味。

这是使用prototype.js 和 PURE 模板引擎时的样子:

$('div.content')[0].render([1,2,3], {
    'a.clicker':{
        'id <-':{
            '.':'Do #{id}!',
            '@onclick':'javascript:doSomethingUseful(#{id});'
        }
    }
});

If it is not the only HTML generation you want to run in your page, you may consider a javascript templating engine.
There are several advantages, the main one being a clear cut between the HTML view and the JS logic.

There are plenty of these engines available for every taste.

Here is how it would look with prototype.js and the PURE template engine:

$('div.content')[0].render([1,2,3], {
    'a.clicker':{
        'id <-':{
            '.':'Do #{id}!',
            '@onclick':'javascript:doSomethingUseful(#{id});'
        }
    }
});
涙—继续流 2024-08-25 13:39:12

在IE中你可以设置outerHTML。在 FF 中,您可以使用以下命令:

http://snipplr.com/view/5460 /outerhtml-in-firefox/

In IE you can set outerHTML. In FF, you can use this:

http://snipplr.com/view/5460/outerhtml-in-firefox/

挖个坑埋了你 2024-08-25 13:39:12

所以我这样做的方法是:

  1. 使用类 clicker 迭代所有位于类 div 中的锚点,类 item 位于类内部content
  2. 对于每个锚点,添加一个函数来隐藏该锚点,然后附加您想要的 3 个锚点

所以这是我的 html 块的样子:

<div class="content">
  <div class="item">
    <img src="images/pic1.jpg" />
    <a class="clicker" href='#'>Do ##!</a>
    <h3>title</h3>
    <p>description</p>
  </div>
</div>

我需要包含 Prototype

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/prototype/1.6.1.0/prototype.js"></script>

还有一个用于保存替换 html 的变量,以及一个虚拟函数,以便我们插入的内容起作用:

var myReplacementHtml = '<a class="clicker" onclick="doSomethingUseful(1);" href="#">Do 1!</a>';
myReplacementHtml += ' <a class="clicker" onclick="doSomethingUseful(2);" href="#">Do 2!</a>';
myReplacementHtml += ' <a class="clicker" onclick="doSomethingUseful(3);" href="#">Do 3!</a>';

function doSomethingUseful(n) {
    alert(n);
    return false;
}

然后这是我的代码,您可能会找到它对于了解这些工作原理的背景故事很有用:$$< /a>, Element.observe, < a href="http://www.prototypejs.org/api/element/methods/hide" rel="nofollow noreferrer">Element.hide, Element.insertElement.insert prototypejs.org/api/event/stop" rel="nofollow noreferrer">Event.stop

<script type="text/javascript">
Event.observe(window, 'load', function(){
    $('.content .item a.clicker').each(function(item){
        item.observe('click', function(evt){
            item.hide();
            Element.insert(item, {after: myReplacementHtml});
        });
        Event.stop(evt);
    });
});
</script>

So the way I would do this is:

  1. Iterate over all the anchors with class clicker that are inside a div with class item which are inside class content
  2. To each one, add a function which will hide that anchor, and then append the 3 anchors you want

So here's what my html chunk looks like:

<div class="content">
  <div class="item">
    <img src="images/pic1.jpg" />
    <a class="clicker" href='#'>Do ##!</a>
    <h3>title</h3>
    <p>description</p>
  </div>
</div>

And I need to include Prototype:

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/prototype/1.6.1.0/prototype.js"></script>

And a variable to hold your replacement html, and a dummy function so what we insert works:

var myReplacementHtml = '<a class="clicker" onclick="doSomethingUseful(1);" href="#">Do 1!</a>';
myReplacementHtml += ' <a class="clicker" onclick="doSomethingUseful(2);" href="#">Do 2!</a>';
myReplacementHtml += ' <a class="clicker" onclick="doSomethingUseful(3);" href="#">Do 3!</a>';

function doSomethingUseful(n) {
    alert(n);
    return false;
}

Then here's my code, you may find it useful to get the backstory on how these work: $$, Element.observe, Element.hide, Element.insert, Event.stop:

<script type="text/javascript">
Event.observe(window, 'load', function(){
    $('.content .item a.clicker').each(function(item){
        item.observe('click', function(evt){
            item.hide();
            Element.insert(item, {after: myReplacementHtml});
        });
        Event.stop(evt);
    });
});
</script>
昔梦 2024-08-25 13:39:12

您可以添加和附加元素。

function doSomethingUseful(val) {

  var ele = document.getElementById('myDiv');
  var newdiv = document.createElement('div');
  var divIdName = 'my'+num+'Div';
  newdiv.setAttribute('id',divIdName);
  ni.appendChild(newdiv);
}

You can add and append elements.

function doSomethingUseful(val) {

  var ele = document.getElementById('myDiv');
  var newdiv = document.createElement('div');
  var divIdName = 'my'+num+'Div';
  newdiv.setAttribute('id',divIdName);
  ni.appendChild(newdiv);
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文