通过 jQuery 附加 HTML 字符串

2023-12-21

我想使用 jQuery 附加生成以下 HTML 字符串。手动编写代码对我来说看起来太麻烦了。

 <div>

    <label>Name (Optional)</label>
    <input type='text' class='form-control' id='job-name'/><br />

    <label>Quick Schedule</label><br />

    <a class="btn btn-primary" onclick="schedule = '@hourly'; job_string();">Hourly</a>
    <a class="btn btn-primary" onclick="schedule = '@daily'; job_string();">Daily</a>
    <a class="btn btn-primary" onclick="schedule = '@weekly'; job_string();">Weekly</a>
    <a class="btn btn-primary" onclick="schedule = '@monthly'; job_string();">Monthly</a>
    <a class="btn btn-primary" onclick="schedule = '@yearly'; job_string();">Yearly</a><br /><br />

    <div class="row">
        <div class="col-md-2">Minute</div>
        <div class="col-md-2">Hour</div>
        <div class="col-md-2">Day</div>
        <div class="col-md-2">Month</div>
        <div class="col-md-2">Week</div>
    </div>

    <div class="row">
        <div class="col-md-2"><input type="text" class="form-control" id="job-minute" value="*" onclick="this.select();"/></div>
        <div class="col-md-2"><input type="text" class="form-control" id="job-hour" value="*" onclick="this.select();"/></div>
        <div class="col-md-2"><input type="text" class="form-control" id="job-day" value="*" onclick="this.select();"/></div>
        <div class="col-md-2"><input type="text" class="form-control" id="job-month" value="*" onclick="this.select();"/></div>
        <div class="col-md-2"><input type="text" class="form-control" id="job-week" value="*" onclick="this.select();"/></div>
        <div class="col-md-2"><a class="btn btn-primary" onclick="set_schedule();">Set</a></div>
    </div>
  </div>

例如,应该按照下面的格式编写。

$('<div/>').append(

        ).append(

        ) ....

使用 jQuery 附加创建上述 HTML 的最佳方法是什么?这里的领导真的很感激。


您可以使用树状数据结构来表示 HTML。完成后,您可以遍历树,并为每个节点创建相应的元素并将其附加到目标元素。

函数式编程似乎非常适合用最少的代码创建上述对象。您可以通过函数组合来抽象创建复杂的结构。此外,您可以使用数组和高阶函数(如映射)来批量创建元素。

为了让您了解它是如何完成的,请考虑以下用于表示节点(元素)的模型(接口):

interface Node {
  tag: string;
  classNames: string[];
  attrs: {
    [key: string]: string;
  };
  eventHandlers: {
    [key: string]: (...params: any[]) => any;
  };
  children: Node[];
  textChildren: string[];
}

Note:上面的类型定义是用 Typescript 编写的。显然,您可以忽略类型并实现我在纯 JavaScript 中描述的内容。

现在考虑以下标记:

<div class="row">
    <div class="col-md-2"><input type="text" class="form-control" id="job-minute" value="*" onclick="this.select();"/></div>
    <div class="col-md-2"><input type="text" class="form-control" id="job-hour" value="*" onclick="this.select();"/></div>
    <div class="col-md-2"><input type="text" class="form-control" id="job-day" value="*" onclick="this.select();"/></div>
    <div class="col-md-2"><input type="text" class="form-control" id="job-month" value="*" onclick="this.select();"/></div>
    <div class="col-md-2"><input type="text" class="form-control" id="job-week" value="*" onclick="this.select();"/></div>
    <div class="col-md-2"><a class="btn btn-primary" onclick="set_schedule();">Set</a></div>
</div>

让我们定义一些辅助函数,这样我们就可以更容易地创建等效的树:

const createRow = (children) => ({
  tag: "div",
  classNames: ["row"],
  attrs: {},
  eventHandlers: {},
  children,
  textChildren: []
});

const createCol = (cls, children) => ({
  tag: "div",
  classNames: [cls],
  attrs: {},
  eventHandlers: {},
  children,
  textChildren: []
});

const createFormInput = (attrs, eventHandlers) => ({
  tag: "input",
  attrs,
  classNames: ["form-control"],
  eventHandlers,
  children: [],
  textChildren: []
});

const createFormInputTextInCol = id =>
  createCol("col-md-2", [
    createFormInput(
      {
        type: "text",
        id,
        value: "*"
      },
      {
        click() {
          this.select();
        }
      }
    )
  ]);

const createAnchorButton = (text, eventHandlers) => ({
  tag: "a",
  attrs: {},
  classNames: ["btn", "btn-primary"],
  eventHandlers,
  children: [],
  textChildren: [text]
});

使用上面定义的函数,创建等效的树非常简单:

const row = createRow([
  ...["job-minute", "job-hour", "job-day", "job-month", "job-week"].map(
    createFormInputTextInCol
  ),
  createCol("col-md-2", [
    createAnchorButton("Set", {
      click() {
        // TODO: define set_schedule
        // set_schedule();
      }
    })
  ])
]);

要将这个对象转换为(JQuery 包装的)元素,您可以执行以下操作:

const toElement = node => {
  const element = $(`<${node.tag}>`);
  Object.keys(node.attrs).forEach(key => {
    element.attr(key, node.attrs[key]);
  });
  element.addClass(node.classNames.join(" "));
  Object.keys(node.eventHandlers).forEach(key => {
    element.on(key, function(...args) {
      node.eventHandlers[key].call(this, ...args);
    });
  });
  node.textChildren.map(text => document.createTextNode(text)).forEach(e => element.append(e));
  node.children.map(toElement).forEach(e => element.append(e));
  return element;
};
$('<div />').append(toElement(row));

Demo

const createRow = (children) => ({
  tag: "div",
  classNames: ["row"],
  attrs: {},
  eventHandlers: {},
  children,
  textChildren: []
});

const createCol = (cls, children) => ({
  tag: "div",
  classNames: [cls],
  attrs: {},
  eventHandlers: {},
  children,
  textChildren: []
});

const createFormInput = (attrs, eventHandlers) => ({
  tag: "input",
  attrs,
  classNames: ["form-control"],
  eventHandlers,
  children: [],
  textChildren: []
});

const createFormInputTextInCol = id =>
  createCol("col-md-2", [
    createFormInput({
      type: "text",
      id,
      value: "*"
    }, {
      click() {
        this.select();
      }
    })
  ]);

const createAnchorButton = (text, eventHandlers) => ({
  tag: "a",
  attrs: {},
  classNames: ["btn", "btn-primary"],
  eventHandlers,
  children: [],
  textChildren: [text]
});

const row = createRow([
  ...["job-minute", "job-hour", "job-day", "job-month", "job-week"].map(
    createFormInputTextInCol
  ),
  createCol("col-md-2", [
    createAnchorButton("Set", {
      click() {
        // TODO: define set_schedule
        // set_schedule();
      }
    })
  ])
]);

const toElement = node => {
  const element = $(`<${node.tag}>`);
  Object.keys(node.attrs).forEach(key => {
    element.attr(key, node.attrs[key]);
  });
  element.addClass(node.classNames.join(" "));
  Object.keys(node.eventHandlers).forEach(key => {
    element.on(key, function(...args) {
      node.eventHandlers[key].call(this, ...args);
    });
  });
  node.textChildren.map(text => document.createTextNode(text)).forEach(e => element.append(e));
  node.children.map(toElement).forEach(e => element.append(e));
  return element;
};

$(document).ready(() => {
  const rowElement = toElement(row);
  $("#wrapper").html(rowElement);
  $("#outerHtml").text($("#wrapper").html());
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<link href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-MCw98/SFnGE8fJT3GXwEOngsV7Zt27NXFoaoApmYm81iuXoPkFOJwJ8ERdknLPMO" crossorigin="anonymous">

<h2>Generated HTML</h2>
<pre id="outerHtml"></pre>

<h2>Appended Element</h2>
<div id="wrapper"></div>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

通过 jQuery 附加 HTML 字符串 的相关文章

  • 本地推送通知到在应用程序内运行 JS 代码的 Win8 Live Tile

    我正在尝试将更新发送到我的应用程序的磁贴 当应用程序运行时 这可以正常工作 例如 当用户单击按钮时 我可以轻松地将磁贴更新通知发送到磁贴 我无法解决的是当应用程序无法运行时如何更新磁贴 我找到的唯一选择是使用以下命令从远程 Web 服务器拉
  • 两列表:一列尽可能小,另一列占据其余部分

    我在 div 中有一个 to columns 表 div table tbody tr td class action a a td td class content p Bigger text variable size p td tr
  • 如何使用 Scrapy 从网站获取所有纯文本?

    我希望在 HTML 呈现后 可以从网站上看到所有文本 我正在使用 Scrapy 框架使用 Python 工作 和xpath body text 我能够获取它 但是带有 HTML 标签 而且我只想要文本 有什么解决办法吗 最简单的选择是ext
  • 如何使用 Greasemonkey 监视静态 HTML 页面的更改?使用哈希?

    我希望我的 Greasemonkey 脚本仅在其访问的静态页面具有与以前完全相同的内容时运行 现在我可以设置一个包含该页面哈希的变量 我正在寻找一种动态散列页面的方法 以便我可以将我的散列与生成的散列进行比较 关于如何即时实现散列的任何想法
  • 如何使用 Javascript 设置查询字符串

    有没有办法使用 javascript 设置查询字符串的值 我的页面有一个过滤器列表 单击该列表时 它将更改右侧的页内结果窗格 我正在尝试更新 url 的查询字符串值 因此如果用户离开页面 然后单击 后退 按钮 他们将返回到最后一个过滤器选择
  • 将 Firebase 云消息传递与 Windows 应用程序结合使用

    我在 Android 和 iOS 应用程序中使用 Firebase Cloud Messaging 但是我还有此应用程序的 Windows Mac OS 版本 我想保留相同的逻辑 我知道 Firebase Cloud Messaging 可
  • 使用 JavaScript 移动页面上的按钮

    我的按钮可以移动 但奇怪的是 我无法弄清楚偏移是否有问题 我希望我的按钮随着鼠标光标移动 但现在它的移动方式不是我想要的 有时它会消失 另外 创建的新按钮是重叠的 我不知道如何解决这个问题并拥有更好的外观 var coorA var coo
  • 编辑第一个选项名称

    我有以下我无法访问的代码 我想要做的是将一些文本添加到现在为空的第一个选项中 诸如 选择地址 之类的文本
  • 如何停止TinyMCE删除span标签?

    在我的工作中 前一位程序员决定使用公司网站上精彩的TinyMCE 我遇到的数千个问题之一是 如果原文有的话span标签 当我按下退格键删除一行 p仅标签 全部span标签已从文本中删除 这个错误比另一个错误更具体 我可以删除anything
  • 如何计算特定字符在字符串中出现的次数

    我正在尝试创建一个函数来查看数组中的任何字符是否在字符串中 如果是 有多少个 我尝试计算每一种模式 但是太多了 我尝试使用 Python 中的 in 运算符的替代方案 但效果不佳 function calc fit element var
  • 使用单击事件调用“trigger”方法时的复选框值

    如何在点击事件中获取正确的当前值以通过触发器调用 Html
  • 使用 Javascript 设置 cookie [重复]

    这个问题在这里已经有答案了 我正在尝试构建我的第一个移动应用程序 它需要连接到我的 mysql 数据库并使用 json 返回数据 这很好 目前我有一个登录系统 一旦确定用户名和密码存在 它就会返回一条成功消息 对于下一步 我想在我的页面上使
  • 用于选择特定 div 中具有特定类的锚元素的 jQuery 选择器是什么

    我有一些这样的代码 我想选择每个 a 带有类的标签status在 div 中foo div a class status a div 你可以这样做 foo find status a
  • 如何使用 JavaScript 或 jQuery 克隆 HTML 元素的样式对象?

    我正在尝试克隆元素的样式对象 这应该允许我在更改后重置所述元素的样式 例如 el style left 50px curr style left 50px Modify the elements style The cloned style
  • 使用 Jade 评估自定义 javascript 方法 (CircularJSON)

    我想通过 Jade 将一个对象解析为客户端 JavaScript 通常这会起作用 script var object JSON parse JSON stringify object but my object is circular ht
  • 使用 CSS 折叠和展开元素

    我正在尝试构建一个页面 加载时仅可见标题 并且 当用户单击标题时 每个标题下方的表格会在隐藏和显示状态之间切换 我的限制是只能在 CSS 中执行此操作 这是我到目前为止想到的 https jsfiddle net Argoron c1ypx
  • 从 PHP 数组生成 HTML 表

    我不明白这一点 我需要解决看似简单的问题 但这超出了我的逻辑 我需要编写一个函数 table columns input cols 它将输出一个表 示例 input array apple orange monkey potato chee
  • 使用 next.js 进行服务器端渲染与传统 SSR

    我非常习惯 SSR 意味着页面得到完全刷新并从服务器接收完整 HTML 的方法 其中根据后端堆栈使用 razor pub other 进行渲染 因此 每次用户单击导航链接时 它只会向服务器发送请求 整个页面将刷新 接收新的 HTML 这就是
  • 在 iOS 7 Safari 中,如何区分通过边缘滑动与后退/前进按钮的 popstate 事件?

    在 iOS 7 Safari 中 现在有两种后退 前进导航方式 使用底部的传统后退 前进按钮箭头或从屏幕边缘滑动 我正在使用动画在 ajax 应用程序中的页面之间进行转换 但如果用户通过边缘滑动进行导航 我不想触发该转换 因为这本身就是一个
  • Flot 库将 y 轴设置为最小值 0 和最大值 24

    如何将 y 轴设置在 0 到 24 的范围内 这是我的代码 j plot j placeholder d1 xaxis mode time min new Date 2010 11 01 getTime max new Date 2011

随机推荐

  • 数据表列未对齐和重复排序箭头问题

    每次我显示表格时 我都会在表格中添加一个额外的排序箭头 th Here is an image of the issue I also am having an issue with my columns not aligning corr
  • Spring Security 和多部分请求

    我有一个受 Spring Security 和 OAuth2 保护的 Controller 我试图让我的用户上传文件 Controller RequestMapping value api image public class ImageC
  • OpenCV:选择颜色过滤的 HSV 阈值

    为了从图像中过滤出某种颜色 有必要设置需要检测的颜色的边界 我有一种感觉 这主要是一个试错过程 有没有什么方法可以快速找到特定颜色的正确阈值 在这种特定情况下 我试图检测下图中图表的灰色区域 当然 这没有检测到虚线 对于这个例子 我需要非常
  • 如何在 NSPasteBoard cocoa os x 中复制图像?

    I have tried this one but not working NSPasteboard pboard NSPasteboard generalPasteboard pboard declareTypes NSMutableAr
  • 网络设备发现

    对于我的 Android 应用程序 用户需要连接到托管在同一 LAN 上某处的服务器 同一 LAN 上可以托管多个服务器 为了方便用户 我打算扫描 Android 设备当前连接的 LAN 然后列出所有运行服务器的网络设备 而不是让用户将 I
  • 发布请求被切断

    我的 javascript 发布请求有问题 我有以下代码用于发送帖子请求 var xhttp new XMLHttpRequest xhttp onreadystatechange function if this readyState 4
  • Spark 和 Cassandra Java 应用程序:线程“主”java.lang.NoClassDefFoundError 中出现异常:org/apache/spark/sql/Dataset

    我得到了一个令人惊奇的 siplme java 应用程序 我几乎从这个例子中复制了它 我想做的就是读取表数据并显示在 Eclipse 控制台中 我的 pom xml
  • 减少 Android 应用程序 (apk) 的大小

    我现在将在 Google Play 商店上发布我的第一个应用程序 我已经压缩了我的应用程序中使用的图像 我对应用程序大小有一些疑问 如果应用程序的大小小于 2 MB 则用户卸载该应用程序的可能性较小 对于属于教育领域的应用程序 我的这种说法
  • 一个 Hive 脚本可以从另一个 Hive 脚本运行吗?

    我创建了两个配置单元脚本 script1 hql 和 script2 hql 是否可以从 script1 hql 运行脚本 script2 hql 我读到了有关使用 source 命令的信息 但无法回避它的使用 任何指针 参考文档将不胜感激
  • 如何使用“Entity Framework Core”(又名 EF7)实现“软删除”?

    我正在尝试使用 EF7 实现 软删除 我的Item表有一个名为IsDeleted类型的bit 我在 SO 和其他地方看到的所有例子都使用这样的东西 protected override void OnModelCreating ModelB
  • PHPExcel 获取相对于给定列的列名

    使用 PHPExcel 是否可以获取位于左侧或右侧 X 列的列的名称 例如 给定列 BZ 我想返回列名称 CB 或 BX 向右或向左 2 个 Thanks PHPExcel 中已经内置了一些函数来帮助您执行此操作 adjustment 2
  • 进行多线程 foreach 循环的最佳方法[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我有一个带有 foreach 的发送电子邮件方法 如下所示 static void Main string args foreach
  • 创建一个可供 Android 中所有 Activity 访问的对象

    我正在尝试创建一个包含对象的数据数组列表 例如地址和属性列表 非常复杂 并且想知道 如何使所有活动都可以访问 和可编辑 一个对象 而不仅仅是它本身实例化于 基本上是这样的 在活动 1 中创建数组 在活动 2 和活动 3 中访问相同的数组 P
  • 以编程方式打开组合框下拉列表[重复]

    这个问题在这里已经有答案了 是否有可能directly以编程方式打开 WindowsForms 组合框 还没有找到这样做的方法或属性 如果没有 有哪些可能的解决方案不涉及大量黑客攻击 Use ComboBox DroppedDown htt
  • Unix/Linux 系统调用是 POSIX 库函数的一部分吗?

    Unix Linux 系统调用全部或大部分是 POSIX 中的吗 许多Linux Unix编程书籍都说POSIX库函数可能是OS系统调用的包装器 也可能不是 例如 http www makelinux net books lkd2 ch05
  • jquery获取矩形宽度和高度传单

    我有一张地图和一个区域选择字段 initialize map var map L map map setView 38 0 2 L tileLayer http s tile cloudmade com 70146506bc514228ad
  • 使用 Python BaseHTTPServer 处理同时/异步请求

    我通过创建一个继承自 HTTPServer 和 ThreadingMixIn 的类来设置一个线程 使用 Python 线程 HTTP 服务器 class ThreadedHTTPServer ThreadingMixIn HTTPServe
  • 获取 Git 分支大小

    我正在尝试跟踪我正在进行的项目的规模 有没有一种简单的方法来获取不同分支的磁盘上的存储库大小 I tried git count objects v 但它为每个分支提供相同的存储库大小 With Git 2 31 Q1 2021 git r
  • 你使用ant的任务吗?

    The ant 任务的文档 http ant apache org manual Tasks depend html states 依赖任务的性能为 取决于许多因素 例如 作为类关系的复杂性和 有多少类文件已过期 关于是否是的决定 重新编译
  • 通过 jQuery 附加 HTML 字符串

    我想使用 jQuery 附加生成以下 HTML 字符串 手动编写代码对我来说看起来太麻烦了 div div