spiderhtmltask.js 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792
  1. // 获得采集模式 0: 普通 1: 列表+详情 2: 列表 3: 详情
  2. function getCrawlType(){
  3. var crawlType;// 0: 普通 1: 列表+详情 2: 列表 3: 详情
  4. // 采集模式保存在 文本域里则是人物编辑页 否则是新建任务页
  5. if($("#crawlType").length > 0){
  6. // 编辑任务页
  7. crawlType = $("#crawlType").val();
  8. }else{
  9. // 新建任务页
  10. crawlType = $(".crawlType:checked").val();
  11. }
  12. return crawlType;
  13. }
  14. // 正则 和 xpath切换
  15. function methodChange(){
  16. if($("#method").val() == 1){
  17. $("#regexpTabRow").show();
  18. $("#xpathTabRow").hide();
  19. }else if($("#method").val() == 2){
  20. $("#regexpTabRow").hide();
  21. $("#xpathTabRow").show();
  22. }else {
  23. $("#regexpTabRow").hide();
  24. $("#xpathTabRow").hide();
  25. }
  26. }
  27. //表格错误提示
  28. function tabErr(tabId, msg){
  29. $("#"+tabId).prev().find("div.valierr").find("label").html(msg);
  30. }
  31. //清除表格错误提示
  32. function clearTabErr(tabId){
  33. $("#"+tabId).prev().find("div.valierr").find("label").html("");
  34. }
  35. // 表格行点击事件
  36. function clickTabFunc(tabId){
  37. //单击编辑
  38. $("#"+tabId+" tbody").on( 'click', 'tr', function () {
  39. if(tabId == "headerTab"){
  40. editHeaderTab(this);
  41. }else if(tabId == "pageTab"){
  42. editPageTab(this);regexpTab
  43. }else if(tabId == "regexpTab"){
  44. editRegexpTab(this);
  45. }else if(tabId == "xpathTab"){
  46. editXpathTab(this);
  47. }else if(tabId == "outConfigTab"){
  48. editOutConfigTab(this);
  49. }
  50. });
  51. }
  52. // 提交任务数据保存时,校验表格是否有未提交行,如有保存,并删除保存失败的行
  53. function isSubmitTab(tabId){
  54. if(tabId == "headerTab" && !saveHeaderTab()){
  55. delHeaderTab();
  56. }
  57. if(tabId == "pageTab" && !savePageTab()){
  58. delPageTab();
  59. }
  60. if(tabId == "regexpTab" && !saveRegexpTab()){
  61. delRegexpTab();
  62. }
  63. if(tabId == "xpathTab" && !saveXpathTab()){
  64. delXpathTab();
  65. }
  66. if(tabId == "outConfigTab" && !saveOutConfigTab()){
  67. delOutConfigTab();
  68. }
  69. }
  70. // header -----------------------------------------------------------------------------------
  71. //新建
  72. function addHeaderTab(){
  73. // 新建前先保存
  74. if(!saveHeaderTab()){
  75. return false;
  76. }
  77. var html = "<tr class='edittrue' style='background-color: #B0BED9;'>";
  78. html+= "<td><input type='text' class='form-control' placeholder='header的名称'></td>"
  79. html+= "<td><input type='text' class='form-control' placeholder='header的内容'></td>"
  80. html+= "</tr>"
  81. $("#headerTab tbody").append(html);
  82. $("#headerTab tbody tr.edittrue").click();
  83. }
  84. //保存
  85. function saveHeaderTab(){
  86. clearTabErr("headerTab");
  87. var trDom = $("#headerTab tbody tr.edittrue");
  88. if(trDom.length > 0){
  89. var obj = {};
  90. trDom.find("td").each(function(index){
  91. obj[index] = $(this).find("input").val();
  92. });
  93. if(obj[0].trim() != "" && obj[1].trim() != ""){
  94. trDom.html("<td>"+obj[0]+"</td><td>"+obj[1]+"</td>");
  95. trDom.removeClass("edittrue").css("background-color", "");
  96. }else{
  97. tabErr("headerTab", "header名称和内容不能为空");
  98. return false;
  99. }
  100. }
  101. return true;
  102. }
  103. //编辑
  104. function editHeaderTab(dom){
  105. //判断点击的行是否已在编辑状态
  106. if($(dom).hasClass("edittrue")){
  107. return;
  108. }
  109. // 否则,编辑前先保存当前
  110. if(!saveHeaderTab()){
  111. return false;
  112. }
  113. // 标记为编辑 和 高亮
  114. $(dom).addClass("edittrue").css("background-color", "#B0BED9");
  115. var html = "";
  116. $(dom).find("td").each(function(index){
  117. html+= "<td><input type='text' value='"+$(this).html()+"' class='form-control'></td>"
  118. });
  119. $(dom).html(html);
  120. }
  121. //删除
  122. function delHeaderTab(){
  123. clearTabErr("headerTab");
  124. if($("#headerTab tbody tr.edittrue").length > 0){
  125. $("#headerTab tbody tr.edittrue").remove();
  126. }else{
  127. swal({title: "提示", text: "请选中要删除的数据!", confirmButtonText: "确定!",confirmButtonColor: "#1ab394"});
  128. }
  129. }
  130. // page -----------------------------------------------------------------------------------
  131. //新建
  132. function addPageTab(){
  133. // 新建前先保存
  134. if(!savePageTab()){
  135. return false;
  136. }
  137. var html = "<tr class='edittrue' style='background-color: #B0BED9;'>";
  138. html+= "<td><input type='text' class='form-control'></td>"
  139. html+= "<td><input type='text' class='form-control'></td>"
  140. html+= "</tr>"
  141. $("#pageTab tbody").append(html);
  142. $("#pageTab tbody tr.edittrue").click();
  143. }
  144. //保存
  145. function savePageTab(){
  146. clearTabErr("pageTab");
  147. var trDom = $("#pageTab tbody tr.edittrue");
  148. if(trDom.length > 0){
  149. var obj = {};
  150. trDom.find("td").each(function(index){
  151. obj[index] = $(this).find("input").val();
  152. });
  153. if(obj[0].trim() != "" && obj[1].trim() != ""){
  154. trDom.html("<td>"+obj[0]+"</td><td>"+obj[1]+"</td>");
  155. trDom.removeClass("edittrue").css("background-color", "");
  156. }else{
  157. tabErr("pageTab", "分页参数和页码范围不能为空");
  158. return false;
  159. }
  160. }
  161. return true;
  162. }
  163. //编辑
  164. function editPageTab(dom){
  165. //判断点击的行是否已在编辑状态
  166. if($(dom).hasClass("edittrue")){
  167. return;
  168. }
  169. // 否则,编辑前先保存当前
  170. if(!savePageTab()){
  171. return false;
  172. }
  173. // 标记为编辑 和 高亮
  174. $(dom).addClass("edittrue").css("background-color", "#B0BED9");
  175. var html = "";
  176. $(dom).find("td").each(function(index){
  177. html+= "<td><input type='text' value='"+$(this).html()+"' class='form-control'></td>"
  178. });
  179. $(dom).html(html);
  180. }
  181. //删除
  182. function delPageTab(){
  183. clearTabErr("pageTab");
  184. if($("#pageTab tbody tr.edittrue").length > 0){
  185. $("#pageTab tbody tr.edittrue").remove();
  186. }else{
  187. swal({title: "提示", text: "请选中要删除的数据!", confirmButtonText: "确定!",confirmButtonColor: "#1ab394"});
  188. }
  189. }
  190. // regexp -----------------------------------------------------------------------------------
  191. //新建
  192. function addRegexpTab(){
  193. // 新建前先保存
  194. if(!saveRegexpTab()){
  195. return false;
  196. }
  197. var html = "<tr class='edittrue addtrue' style='background-color: #B0BED9;'>";
  198. html+= "<td><input type='text' class='form-control' placeholder='链接提取字段名:LINK,图片提取字段名:IMAGE'></td>"
  199. // 0: 普通 1: 列表+详情 2: 列表 3: 详情
  200. var crawlType = getCrawlType();
  201. if(crawlType == "0" || crawlType == "3"){
  202. html+= "<td>正文模版</td>"
  203. }else if(crawlType == 2){
  204. html+= "<td>链接模版</td>"
  205. }else{
  206. html+= "<td><select class='form-control'><option value='链接模版'>链接模版</option><option value='正文模版'>正文模版</option></select></td>";
  207. }
  208. html+= "<td><input type='text' value='ROOT' class='form-control'></td>";
  209. html+= "<td><input type='text' class='form-control'></td>";
  210. html+= "<td><input type='text' class='form-control'></td>"
  211. html+= "</tr>"
  212. $("#regexpTab tbody").append(html);
  213. $("#regexpTab tbody tr.edittrue").click();
  214. }
  215. //保存
  216. function saveRegexpTab(){
  217. clearTabErr("regexpTab");
  218. var trDom = $("#regexpTab tbody tr.edittrue");
  219. if(trDom.length > 0){
  220. var obj = {};
  221. trDom.find("td").each(function(index){
  222. if(index == 1){
  223. if($(this).html().indexOf("select") != -1){
  224. obj[index] = $(this).find("select").val();
  225. }else{
  226. obj[index] = $(this).html();
  227. }
  228. }else{
  229. obj[index] = $(this).find("input").val();
  230. }
  231. });
  232. if(obj[0].trim() != "" && obj[3].trim() != ""){
  233. obj[2] = obj[2].replace(/</g, "&lt;").replace(/>/g, "&gt;");//转译
  234. obj[3] = obj[3].replace(/</g, "&lt;").replace(/>/g, "&gt;");//转译
  235. trDom.html("<td>"+obj[0]+"</td><td>"+obj[1]+"</td><td>"+obj[2]+"</td><td>"+obj[3]+"</td><td>"+obj[4]+"</td>");
  236. trDom.removeClass("edittrue").css("background-color", "");
  237. if(trDom.hasClass("addtrue")){
  238. // 新建 保存时,创建输出配置
  239. $("#outConfigTab tbody").append("<tr><td>"+obj[0]+"</td><td>value</td><td>[@"+obj[0]+"@]</td></tr>");
  240. //删除新建标识
  241. trDom.removeClass("addtrue");
  242. }
  243. }else{
  244. tabErr("regexpTab", "字段名称和正则配置不能为空");
  245. return false;
  246. }
  247. }
  248. return true;
  249. }
  250. //编辑
  251. function editRegexpTab(dom){
  252. //判断点击的行是否已在编辑状态
  253. if($(dom).hasClass("edittrue")){
  254. return;
  255. }
  256. // 否则,编辑前先保存当前
  257. if(!saveRegexpTab()){
  258. return false;
  259. }
  260. // 标记为编辑 和 高亮
  261. $(dom).addClass("edittrue").css("background-color", "#B0BED9");
  262. var html = "";
  263. var tdObjArr = [];
  264. $(dom).find("td").each(function(index){
  265. if(index == 0){
  266. html+= "<td><input type='text' value='"+$(this).html()+"' class='form-control' placeholder='链接提取字段名:LINK,图片提取字段名:IMAGE'></td>"
  267. }else if(index == 1){
  268. // 0: 普通 1: 列表+详情 2: 列表 3: 详情
  269. var crawlType = getCrawlType();
  270. if(crawlType == "0" || crawlType == "3"){
  271. html+= "<td>"+$(this).html()+"</td>"
  272. }else if(crawlType == 2){
  273. html+= "<td>"+$(this).html()+"</td>"
  274. }else{
  275. html+= "<td><select class='form-control'>";
  276. html+= "<option value='链接模版'";
  277. if($(this).html() == "链接模版"){
  278. html+= " selected";
  279. }
  280. html+= ">链接模版</option>";
  281. html+= "<option value='正文模版'";
  282. if($(this).html() == "正文模版"){
  283. html+= " selected";
  284. }
  285. html+= ">正文模版</option>";
  286. html+= "</select></td>";
  287. }
  288. }else if(index == 2 || index == 3){
  289. var tdVal = $(this).html().replace(/&lt;/g, "<").replace(/&gt;/g, ">");
  290. tdObjArr.push({"index": index, "value": tdVal});
  291. html+= "<td><input type='text' value='' class='form-control'></td>";
  292. }else{
  293. html+= "<td><input type='text' value='"+$(this).html()+"' class='form-control'></td>";
  294. }
  295. });
  296. $(dom).html(html);
  297. // 正则直接填入input会有问题, 这里用jquery赋值
  298. $.each(tdObjArr, function(i, obj){
  299. $(dom).find("td").eq(obj.index).find("input").val(obj.value);
  300. });
  301. }
  302. //删除
  303. function delRegexpTab(){
  304. clearTabErr("regexpTab");
  305. if($("#regexpTab tbody tr.edittrue").length > 0){
  306. $("#regexpTab tbody tr.edittrue").remove();
  307. }else{
  308. swal({title: "提示", text: "请选中要删除的数据!", confirmButtonText: "确定!",confirmButtonColor: "#1ab394"});
  309. }
  310. }
  311. // xpath -----------------------------------------------------------------------------------
  312. //新建
  313. function addXpathTab(){
  314. // 新建前先保存
  315. if(!saveXpathTab()){
  316. return false;
  317. }
  318. var html = "<tr class='edittrue addtrue' style='background-color: #B0BED9;'>";
  319. html+= "<td><input type='text' class='form-control' placeholder='链接提取字段名:LINK,图片提取字段名:IMAGE'></td>"
  320. // 0: 普通 1: 列表+详情 2: 列表 3: 详情
  321. var crawlType = getCrawlType();
  322. if(crawlType == "0" || crawlType == "3"){
  323. html+= "<td>正文模版</td>"
  324. }else if(crawlType == 2){
  325. html+= "<td>链接模版</td>"
  326. }else{
  327. html+= "<td><select class='form-control'><option value='链接模版'>链接模版</option><option value='正文模版'>正文模版</option></select></td>";
  328. }
  329. html+= "<td><div class='input-group'><input type='text' class='form-control'><span class='input-group-btn'>" +
  330. "<button id='xpath_pid' type='button' class='btn btn-primary' onclick='openXpathEdit(this)'>选择</button></span></div></td>";
  331. html+= "<td><div class='input-group'><input type='text' class='form-control'><span class='input-group-btn'>" +
  332. "<button id='xpath' type='button' class='btn btn-primary' onclick='openXpathEdit(this)'>选择</button></span></div></td>";
  333. html+= "<td><input type='text' class='form-control'></td>"
  334. html+= "</tr>"
  335. $("#xpathTab tbody").append(html);
  336. $("#xpathTab tbody tr.edittrue").click();
  337. }
  338. //保存
  339. function saveXpathTab(){
  340. clearTabErr("xpathTab");
  341. var trDom = $("#xpathTab tbody tr.edittrue");
  342. if(trDom.length > 0){
  343. var obj = {};
  344. trDom.find("td").each(function(index){
  345. if(index == 1){
  346. if($(this).html().indexOf("select") != -1){
  347. obj[index] = $(this).find("select").val();
  348. }else{
  349. obj[index] = $(this).html();
  350. }
  351. }else{
  352. obj[index] = $(this).find("input").val();
  353. }
  354. });
  355. if(obj[0].trim() != "" && obj[3].trim() != ""){
  356. trDom.html("<td>"+obj[0]+"</td><td>"+obj[1]+"</td><td>"+obj[2]+"</td><td>"+obj[3]+"</td><td>"+obj[4]+"</td>");
  357. trDom.removeClass("edittrue").css("background-color", "");
  358. if(trDom.hasClass("addtrue")){
  359. // 新建 保存时,创建输出配置
  360. $("#outConfigTab tbody").append("<tr><td>"+obj[0]+"</td><td>value</td><td>[@"+obj[0]+"@]</td></tr>");
  361. //删除新建标识
  362. trDom.removeClass("addtrue");
  363. }
  364. }else{
  365. tabErr("xpathTab", "字段名称和xpath配置不能为空");
  366. return false;
  367. }
  368. }
  369. return true;
  370. }
  371. //编辑
  372. function editXpathTab(dom){
  373. //判断点击的行是否已在编辑状态
  374. if($(dom).hasClass("edittrue")){
  375. return;
  376. }
  377. // 否则,编辑前先保存当前
  378. if(!saveXpathTab()){
  379. return false;
  380. }
  381. // 标记为编辑 和 高亮
  382. $(dom).addClass("edittrue").css("background-color", "#B0BED9");
  383. var html = "";
  384. $(dom).find("td").each(function(index){
  385. if(index == 0){
  386. html+= "<td><input type='text' value='"+$(this).html()+"' class='form-control' placeholder='链接提取字段名:LINK,图片提取字段名:IMAGE'></td>"
  387. }else if(index == 1){
  388. // 0: 普通 1: 列表+详情 2: 列表 3: 详情
  389. var crawlType = getCrawlType();
  390. if(crawlType == "0" || crawlType == "3"){
  391. html+= "<td>"+$(this).html()+"</td>"
  392. }else if(crawlType == 2){
  393. html+= "<td>"+$(this).html()+"</td>"
  394. }else{
  395. html+= "<td><select class='form-control'>";
  396. html+= "<option value='链接模版'";
  397. if($(this).html() == "链接模版"){
  398. html+= " selected";
  399. }
  400. html+= ">链接模版</option>";
  401. html+= "<option value='正文模版'";
  402. if($(this).html() == "正文模版"){
  403. html+= " selected";
  404. }
  405. html+= ">正文模版</option>";
  406. html+= "</select></td>";
  407. }
  408. }else if(index == 2){
  409. html+= "<td><div class='input-group'><input type='text' value='"+$(this).html()+"' class='form-control'><span class='input-group-btn'>" +
  410. "<button id='xpath_pid' type='button' class='btn btn-primary' onclick='openXpathEdit(this)'>选择</button></span></div></td>";
  411. }else if(index == 3){
  412. html+= "<td><div class='input-group'><input type='text' value='"+$(this).html()+"' class='form-control'><span class='input-group-btn'>" +
  413. "<button id='xpath' type='button' class='btn btn-primary' onclick='openXpathEdit(this)'>选择</button></span></div></td>";
  414. }else{
  415. html+= "<td><input type='text' value='"+$(this).html()+"' class='form-control'></td>";
  416. }
  417. });
  418. $(dom).html(html);
  419. }
  420. //删除
  421. function delXpathTab(){
  422. clearTabErr("xpathTab");
  423. if($("#xpathTab tbody tr.edittrue").length > 0){
  424. $("#xpathTab tbody tr.edittrue").remove();
  425. }else{
  426. swal({title: "提示", text: "请选中要删除的数据!", confirmButtonText: "确定!",confirmButtonColor: "#1ab394"});
  427. }
  428. }
  429. // outconfig -----------------------------------------------------------------------------------
  430. //新建
  431. function addOutConfigTab(){
  432. // 新建前先保存
  433. if(!saveOutConfigTab()){
  434. return false;
  435. }
  436. var html = "<tr class='edittrue' style='background-color: #B0BED9;'>";
  437. html+= "<td><input type='text' class='form-control'></td>"
  438. html+= "<td><select class='form-control'><option value='value'>value</option><option value='拼接'>拼接</option></select></td>";
  439. html+= "<td><input type='text' class='form-control' placeholder='[@临时变量1@]_[@临时变量2@]'></td>"
  440. html+= "</tr>"
  441. $("#outConfigTab tbody").append(html);
  442. $("#outConfigTab tbody tr.edittrue").click();
  443. }
  444. //保存
  445. function saveOutConfigTab(){
  446. clearTabErr("outConfigTab");
  447. var trDom = $("#outConfigTab tbody tr.edittrue");
  448. if(trDom.length > 0){
  449. var obj = {};
  450. trDom.find("td").each(function(index){
  451. if($(this).find("select").length > 0){
  452. obj[index] = $(this).find("select").val();
  453. }else{
  454. obj[index] = $(this).find("input").val();
  455. }
  456. });
  457. if(obj[0].trim() != "" && obj[2].trim() != ""){
  458. trDom.html("<td>"+obj[0]+"</td><td>"+obj[1]+"</td><td>"+obj[2]+"</td>");
  459. trDom.removeClass("edittrue").css("background-color", "");
  460. }else{
  461. tabErr("outConfigTab", "字段名和处理语法不能为空");
  462. return false;
  463. }
  464. }
  465. return true;
  466. }
  467. //编辑
  468. function editOutConfigTab(dom){
  469. //判断点击的行是否已在编辑状态
  470. if($(dom).hasClass("edittrue")){
  471. return;
  472. }
  473. // 否则,编辑前先保存当前
  474. if(!saveOutConfigTab()){
  475. return false;
  476. }
  477. // 标记为编辑 和 高亮
  478. $(dom).addClass("edittrue").css("background-color", "#B0BED9");
  479. var html = "";
  480. $(dom).find("td").each(function(index){
  481. if(index == 1){
  482. html+= "<td><select class='form-control'>";
  483. html+= "<option value='value'";
  484. if($(this).html() == "value"){
  485. html+= " selected";
  486. }
  487. html+= ">value</option>";
  488. html+= "<option value='拼接'";
  489. if($(this).html() == "拼接"){
  490. html+= " selected";
  491. }
  492. html+= ">拼接</option>";
  493. html+= "</select></td>";
  494. }else{
  495. html+= "<td><input type='text' value='"+$(this).html()+"' class='form-control'></td>"
  496. }
  497. });
  498. $(dom).html(html);
  499. }
  500. //删除
  501. function delOutConfigTab(){
  502. clearTabErr("outConfigTab");
  503. if($("#outConfigTab tbody tr.edittrue").length > 0){
  504. $("#outConfigTab tbody tr.edittrue").remove();
  505. }else{
  506. swal({title: "提示", text: "请选中要删除的数据!", confirmButtonText: "确定!",confirmButtonColor: "#1ab394"});
  507. }
  508. }
  509. //XPath 可视化-------------------------------------------------------------------------------------
  510. // 0: 链接模版 1: 正文模版
  511. var savetype;
  512. // xpath可视化编辑的列数
  513. var count = 1;
  514. // 编辑类型 xpath:子节点 xpath_pid:父节点
  515. var xpathEditType = "xpath";
  516. //打开可视化编辑
  517. function openXpathEdit(dom){
  518. if($("#mainUrl").val() != ""){
  519. // 获得采集模式 0: 普通 1: 列表+详情 2: 列表 3: 详情
  520. // 列表+详情 任务时 正则和xpath 新建编辑时 展示类别编辑,否则按模式默认选项
  521. var crawlType = getCrawlType();
  522. if(crawlType == 1){// 列表+详情
  523. savetype = $("#xpathTab tbody tr.edittrue").find("select").val();
  524. }else if(crawlType == 2){//列表
  525. // 链接模版
  526. savetype = 0;
  527. }else if(crawlType == 3 || crawlType == 0){//详情
  528. // 正文模版
  529. savetype = 1;
  530. }
  531. // xpath可视化编辑的列数 还原
  532. count = 1;
  533. // 编辑类型 xpath:子节点 xpath_pid:父节点
  534. xpathEditType = $(dom).attr("id");
  535. jQuery.ajax({
  536. url: "spiderHtmlTask/extract",
  537. // data: {mainUrl: "http://news.cctv.com/2017/09/15/ARTIrjSD08QwGpHiuiyZ3fi1170915.shtml"},
  538. data: {mainUrl: $("#mainUrl").val()},
  539. dataType: "html",
  540. success: function (data) {
  541. //html源码转json有异常,这里处理字符串
  542. if (data.indexOf("$$$successXpath: true,$$$") != -1) {
  543. var html = data.replace("$$$successXpath: true,$$$", "").replace("/");
  544. var scripthtml = "<script type=\"text/javascript\">";
  545. scripthtml += "window.onload = function (e) {";
  546. scripthtml += "parent.init(document);";
  547. //类别:0链接模板(列表),1正文模板 (详情)
  548. if (savetype == 0) {
  549. scripthtml += "document.onclick = function (e) {parent.docClick(e);}";
  550. } else {
  551. scripthtml += "document.onclick = function (e) {parent.docClick(e,0);}";
  552. }
  553. scripthtml += "}";
  554. scripthtml += "<\/script>";
  555. html = html.replace("<\/body>", scripthtml + "<\/body>");
  556. $("#ifram").attr("srcdoc", html);
  557. openXPathClick();
  558. } else {
  559. swal({title: "提示", text: data.replace("$$$successXpath: false,$$$", ""), confirmButtonText: "确定",confirmButtonColor: "#1ab394"});
  560. }
  561. }
  562. });
  563. }else{
  564. swal({title: "提示", text: "入口URL不能为空", confirmButtonText: "确定",confirmButtonColor: "#1ab394"});
  565. }
  566. }
  567. //完成创建xpath
  568. function saveXpath() {
  569. var divs = document.getElementsByClassName("_dw_th th");
  570. if (divs.length > 0) {
  571. var xpathArr = "";
  572. var nameArr = "";
  573. var num = 0;
  574. for (var i = 0; i < divs.length; i++) {
  575. var xpath = $(divs[i]).find("xpath").html();
  576. var name = $(divs[i]).find("input").val();
  577. if (xpath && xpath != "" && name && name != "") {
  578. if(xpathArr != ""){
  579. xpathArr += "$$$$$$";
  580. nameArr += "$$$$$$";
  581. }
  582. xpathArr += xpath;
  583. nameArr += name;
  584. num++;
  585. }
  586. }
  587. // 编辑类型 xpath:子节点(唯一) xpath_pid:父节点(多值)
  588. if(xpathEditType == "xpath"){
  589. $("#xpath").parent().prev().val(xpathArr);
  590. }else if(xpathEditType == "xpath_pid"){
  591. $("#xpath_pid").parent().prev().val(xpathArr);
  592. }
  593. } else {
  594. alert('xpath为空!');
  595. return false;
  596. }
  597. closeXPathClick();
  598. }
  599. //删除xpath预览 列表(标题和链接)
  600. function delhtml(dom, delType) {
  601. // 有正文有链接 删除正文列时删除链接列
  602. if(delType && delType == 'text'){
  603. var linkDom = $(dom).parent("div").next();
  604. linkDom.parent("div").parent("div").next("div").find(".tr").eq(linkDom.index()).remove();
  605. linkDom.remove();
  606. }else if(delType && delType == 'link'){
  607. //删除链接列时删除正文列
  608. var textDom = $(dom).parent("div").prev();
  609. textDom.parent("div").parent("div").next("div").find(".tr").eq(textDom.index()).remove();
  610. textDom.remove();
  611. }
  612. var index = $(dom).parent("div").index();
  613. var tbodyDom = $(dom).parent("div").parent("div").parent("div").next("div");
  614. tbodyDom.find(".tr").eq(index).remove();
  615. $(dom).parent("div").remove();
  616. if (tbodyDom.html() == "") {
  617. // 关闭XPath预览
  618. hideLook();
  619. }
  620. //计量数消减
  621. count--;
  622. if(count < 1){
  623. count = 1;
  624. }
  625. }
  626. //编辑xpath标题
  627. function editXpathTitle(dom) {
  628. //$(dom).parent().find("valu_name");
  629. var vnObj = $(dom).parent().find("valu_name");
  630. $(".promptInput").val(vnObj.html());
  631. $(".popUp:first").addClass("showPrompt");
  632. $(".promptBtnCancel").click(function () {
  633. $(".popUp:first").removeClass("showPrompt");
  634. });
  635. $(".promptBtnConfirm").click(function () {
  636. vnObj.html($(".promptInput").val());
  637. $(".popUp:first").removeClass("showPrompt");
  638. });
  639. }
  640. /*<valu_name>列-' + num + '</valu_name>(总共' + totalNum + '条)*/
  641. function getLiThHtml(num, xpath) {
  642. var thhtml = '<div class="_dw_th th">'
  643. + '<xpath style="display: none">' + xpath + '</xpath>'
  644. + '<span>'
  645. + '<div style="position:relative;color: #000000;">'
  646. + '<select style="width:120px;" onchange="this.nextElementSibling.value=this.value">'
  647. + '<option value="标题">标题</option>'
  648. + '<option value="时间">时间</option>'
  649. + '<option value="来源">来源</option>'
  650. + '<option value="作者">作者</option>'
  651. + '</select>'
  652. + '<input id="input" name="input" type="text" value="标题-' + num + '" style="position:absolute;width:99px;height:23px;left:1px;top:2px;border-bottom:0px;border-right:0px;border-left:0px;border-top:0px;z-index: 9999;">'
  653. + '</div>'
  654. + '</span>'
  655. + '<img class="_dw_td _dw_editThead" onclick="editXpathTitle(this)" src="inspinia/image/xpath/IconEdit.png"/>'
  656. + '<img class="_dw_td _dw_delThead" onclick="delhtml(this)" src="inspinia/image/xpath/IconRemove.png"/>'
  657. + '</div>';
  658. return thhtml;
  659. }
  660. function getThHtml(num, totalNum, xpath) {
  661. var thhtml = '<div class="_dw_th th">'
  662. + '<xpath style="display: none">' + xpath + '</xpath>'
  663. + '<span>'
  664. + '<div style="position:relative;color: #000000;">'
  665. + '<select style="width:120px;" onchange="this.nextElementSibling.value=this.value">'
  666. + '<option value="列表1">列表1</option>'
  667. + '<option value="列表2">列表2</option>'
  668. + '<option value="列表3">列表3</option>'
  669. + '<option value="列表4">列表4</option>'
  670. + '</select>'
  671. + '<input id="input" name="input" type="text" value="列表-' + num + '" style="position:absolute;width:99px;height:23px;left:1px;top:2px;border-bottom:0px;border-right:0px;border-left:0px;border-top:0px;z-index: 9999;">'
  672. + '</div>'
  673. + '</span>'
  674. + '<img class="_dw_td _dw_editThead" onclick="editXpathTitle(this)" src="inspinia/image/xpath/IconEdit.png"/>'
  675. + '<img class="_dw_td _dw_delThead" onclick="delhtml(this,\'text\')" src="inspinia/image/xpath/IconRemove.png"/>'
  676. + '</div>'
  677. + '<div class="_dw_th th" style="height: 37px;">'
  678. + '<span>列-' + num + '-链接</span>'
  679. /*+ '<img class="_dw_td _dw_editThead" src="inspinia/image/xpath/IconEdit.png"/>'*/
  680. + '<img class="_dw_td _dw_delThead" onclick="delhtml(this,\'link\')" src="inspinia/image/xpath/IconRemove.png"/>'
  681. + '</div>';
  682. return thhtml;
  683. }
  684. function getTdHtml(list, type) {
  685. var titleHtml = "";
  686. var urlHtml = "";
  687. jQuery.each(list, function (i, obj) {
  688. // false时相当于break, 如果return true 就相当于continure。
  689. var titleText = obj.text;
  690. if (!titleText || titleText == "") {
  691. return true;
  692. }
  693. titleHtml += '<div class="td text value">'
  694. + '<span title="' + titleText + '">'
  695. + titleText
  696. + '</span></div>';
  697. urlHtml += '<div class="td text">'
  698. + '<div class="link" title="' + obj.urls + '">';
  699. if (!obj.urls || obj.urls == "") {
  700. urlHtml += "无";
  701. } else {
  702. urlHtml += obj.urls;
  703. }
  704. urlHtml += '</div>'
  705. + '</div>';
  706. });
  707. var tdhtml = '<div class="tr">'
  708. + titleHtml
  709. + '</div>';
  710. if (type === 0) {
  711. tdhtml += '<div class="tr">'
  712. + urlHtml
  713. + '</div>';
  714. }
  715. return tdhtml;
  716. }
  717. // 打开XPath预览
  718. function showLook(data, xpath, type) {
  719. // 编辑类型 xpath:子节点(唯一) xpath_pid:父节点(多值)
  720. if(xpathEditType == "xpath" && count > 1){
  721. alert('子节点只能选择一个!');
  722. return false;
  723. }
  724. var thhtml = getLiThHtml(count, xpath);
  725. var tdhtml = getTdHtml(data[1]);
  726. if (type === 0) {
  727. thhtml = getThHtml(count, data[0], xpath);
  728. tdhtml = getTdHtml(data[1], 0);
  729. }
  730. //console.log(JSON.stringify(data));
  731. var divs = document.getElementsByClassName("_dw_th th");
  732. for (var i = 0; i < divs.length; i++) {
  733. var value = $(divs[i]).find("xpath").html();
  734. if (xpath === value) {
  735. alert("xpath已存在")
  736. return false;
  737. }
  738. }
  739. $(".tableEditBody .table .thead .tr").append(thhtml);
  740. $(".tableEditBody .table .tbody").append(tdhtml);
  741. count++;
  742. $("#ifram").css("padding-bottom", "304px");
  743. $("#showPreview").show();
  744. }
  745. //标题
  746. function setFrameHtmlTitle(title) {
  747. $(".ruleEditTitle").html(title);
  748. }
  749. //打开xpath提取页面
  750. function openXPathClick() {
  751. //disLoadDiv();//取消加载层
  752. $(".main_center").hide();
  753. $("#pop").show().fadeIn();
  754. // TODO 隐藏任务编辑弹窗 否则input编辑不了
  755. $("#add").css('display','none');
  756. }
  757. //关闭xpath提取页面
  758. function closeXPathClick() {
  759. $(".tableEditBody .table .thead .tr").empty();
  760. $(".tableEditBody .table .tbody").empty();
  761. // 关闭XPath预览
  762. hideLook();
  763. $(".main_center").show();
  764. $("#pop").fadeOut().hide();
  765. }
  766. //关闭XPath预览
  767. function hideLook() {
  768. // 展示任务编辑弹窗
  769. $("#add").css('display','block');
  770. $(".tableEditBody .table .thead .tr").append("");
  771. $(".tableEditBody .table .tbody").append("");
  772. $("#ifram").css("padding-bottom", "80px");
  773. $("#showPreview").hide();
  774. }