定义将单个文本分解为多个条件的脚本

Define a Script to Breakup Single Text to multiple Conditions

提问人:Sachin Agrawal 提问时间:7/28/2023 更新时间:7/30/2023 访问量:54

问:

我在 Tampermonkey 上使用一个简单的脚本来更改网页上的某些值。

在网页中,输入框中有一个输入值,即“FPPUTHP1100000”

这是一个材料代码,材料代码结构如下:-

F 代表 FRESH

PPUTHP 代表 PPC

110 ACS 支架

0000 代表 MRP。

材料代码不是通用的,每次都可以更改。

我想将其记录在变量中,并将合并的文本推送到空的输入框中

像 ACS-PPC-MRP-FRESH

有很多材料代码,但基本结构仅如上所述。

首字母可以是F,C,P,D(FRESH,C&T,PDMG,DMG)

接下来的六个字母可以

PPUTHP,PPUSLH,PPUFLH,43UTHP,53UTHP(PPC,超级,WP,OPC43,OPC53)

接下来的三个字母可以是 110,111,112,113,114 (ACS,VCS,PGU,DGU,AGU)

接下来的四个字母可以是 0000 和 5000(MRP,非 MRP)

谁能说出如何制作这个脚本。

javascript jquery reactjs var

评论


答:

0赞 Geekyvinayak 7/28/2023 #1

首先,使用 Document 将值存储在变量中。getElementById()

喜欢这个。。。

var string = document.getElementById("*replace this with id if input field")

现在只需在此字符串上应用子字符串函数并将它们保存到变量中,如下所示......

var first =  string.substring(1, 0); \\ this will give you the first letter
var second =  string.substring(1, 7); \\ it will give you next 6 letters
var third =  string.substring(7, 10);  \\ it will give you next 3 letters
var fourth =  string.substring(10, 14); \\ it will give you next 4 letter

现在只需应用条件并使你像这样字符串

 let final_string = ""
 if(first == "f"){
  final_string = final_string + "FRESH-"
 }

 else if(first == "C"){
  final_string = final_string + "C&T-"
 }

 else if(first == "P"){
  final_string = final_string + "PDMG-"
 }

 else{
  final_string = final_string + "DMG-"
 }

现在同样应用 if-else 梯形图并相应地将零件添加到final_string。

评论

0赞 Sachin Agrawal 7/28/2023
嗨,先生,请添加更多我想更改的细节$("span:contains('Despatch Detail').text()== "The Merged Text"
1赞 poorly-written-code 7/29/2023
这已经是真正的意大利面了,你只检查了第一个字符。考虑一个案例,当你有一长串/条件要检查时。或者更好的是,使用数组或对象来组织数据。switchifelse
0赞 poorly-written-code 7/29/2023 #2

假设输入始终按照您给定的顺序和长度进行,并且转换始终是您给定的值之一,您可以创建一个数组,其中包含输入的分隔点,然后创建另一个具有匹配索引的数组作为查找字典。像这样的东西:substring

let delimits = [0,1,7,10],
    lookup = [
      { C: 'C&T', D: 'DMG', F: 'FRESH', P: 'PDMG' },
      { PPUTHP:'PPC', PPUSLH: 'SUPER', PPUFLH: 'WP', '43UTHP': 'OPC43', '53UTHP': 'OPC53' },
      { '110': 'ACS', '111': 'VCS', '112': 'PGU', '113': 'DGU', '114': 'AGU' },
      { '0000': 'MRP', '5000': 'NON MRP' }
    ];

document.querySelector('button').addEventListener('click', function() {
  document.querySelector('input.output').value = delimits.map((delimit, index) =>
      lookup[index][document.querySelector('input.input')
        .value.substring(delimit, delimits[index + 1])]
  ).join('-');
});

document.querySelector('input.input').value = 'FPPUTHP1100000';
<input class="input"><button> -> </button><input class="output">

如果您希望输出的顺序与输入的顺序不同,则可以:

orig = output.split('-');
reorder = [orig[2], orig[1], orig[3], orig[0]].join('-');

根据 OP 请求进行编辑。其他一些经验说明:

  • 如果你只使用自己的代码,DOM 遍历是可以的(尽管当你的项目变大时,即使这样也会引起头痛),但如果你试图遍历别人的代码,这是一个非常糟糕的主意。他们可以随时更改布局并破坏您的代码。相反,您应该使用或它们的某种组合来创建显式标识符。idclassattribute

  • 现在一切都是异步的。在其他代码(tampermonkey、greasemonkey 等)之上编写代码时,您的脚本可能会在您尝试访问的元素加载之前就已执行,这使得您的脚本看起来没有执行任何操作。我确信有一种更聪明的方法,但我总是通过简单地将我的脚本包装在一个间隔内并在尝试更改它之前检查元素是否存在/具有我想要更改的属性来解决这个问题。

let loading = setInterval(function() {
  if ($('.thing-required-for-your-script-to-work').length) {
    clearInterval(loading);
    //your script here
  }
}, 1000);

let $input = $('bdi:contains("Material Code")').closest('div').next().find('input'),
    $output = $('span:contains("Despatch Detail")').next(),
    delimits = [0,1,7,10],
    lookup = [
      { C: 'C&T', D: 'DMG', F: 'FRESH', P: 'PDMG' },
      { PPUTHP:'PPC', PPUSLH: 'SUPER', PPUFLH: 'WP', '43UTHP': 'OPC43', '53UTHP': 'OPC53' },
      { '110': 'ACS', '111': 'VCS', '112': 'PGU', '113': 'DGU', '114': 'AGU' },
      { '0000': 'MRP', '5000': 'NON MRP' }
    ];

$input.val('FPPUTHP1100000'); //simulating whatever the page loaded

$output.text(delimits.map((delimit, index) =>
  lookup[index][$input.val().substring(delimit, delimits[index + 1])]).join('-'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<!-- just guessing at the markup based on your code -->
<div><bdi>Material Code</bdi></div>
<div><input></div>
<div><span>Despatch Detail</span><p></p></div>

编辑 2、输出顺序:

let $input = $('bdi:contains("Material Code")').closest('div').next().find('input'),
    $output = $('span:contains("Despatch Detail")').next(),
    delimits = [0,1,7,10],
    lookup = [
      { C: 'C&T', D: 'DMG', F: 'FRESH', P: 'PDMG' },
      { PPUTHP:'PPC', PPUSLH: 'SUPER', PPUFLH: 'WP', '43UTHP': 'OPC43', '53UTHP': 'OPC53' },
      { '110': 'ACS', '111': 'VCS', '112': 'PGU', '113': 'DGU', '114': 'AGU' },
      { '0000': 'MRP', '5000': 'NON MRP' }
    ],
    output_order = [3,2,1,0]; //based on the lookup index

$input.val('FPPUTHP1100000'); //simulating whatever the page loaded

let output = delimits.map((delimit, index) =>
  lookup[index][$input.val().substring(delimit, delimits[index + 1])]);
  
$output.text(output_order.map((index) => output[index]).join('-'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<!-- just guessing at the markup based on your code -->
<div><bdi>Material Code</bdi></div>
<div><input></div>
<div><span>Despatch Detail</span><p></p></div>

评论

0赞 Sachin Agrawal 7/29/2023
“简直太棒了”我真的只想要这样的东西,你能按照我的要求重写代码吗,在我要求的网页中,材料代码存储在这里,我想改变$("bdi:contains('Meterial Code')").closest('div').next().find('input').val()$("span:contains('Despatch Detail').text()== "The Merged Text"
0赞 Sachin Agrawal 7/29/2023
@poolyWriitenCode,每当我打开 URL 时,都无需单击任何地方,它应该会更改。
0赞 poorly-written-code 7/29/2023
通常开发人员都想得到报酬,但幸运的是,我只是在这里帮助其他人学习。根据您的反馈编辑了我的答案。我还要提到它是赋值运算符,并且是相等运算符。 正在检查两者是否相等。在jQuery中,您不在此处使用赋值运算符,而是将文本作为参数传递write the code for you===$('...').text() == '...'$('...').text('...')
0赞 Sachin Agrawal 7/30/2023
哇,先生,你真是太棒了,非常感谢,作为一个新手,我需要时间来正确理解它。
0赞 Sachin Agrawal 7/30/2023
它像黄油一样工作,谢谢先生,非常感谢,感谢您付出宝贵的时间。这次我处于倾斜状态。很多东西要学