You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

JavaScript变量未插入及表单数字输入失效问题排查求助

问题排查与修复方案

我仔细梳理了你的代码,找到了几个核心问题导致这些异常表现,下面逐个拆解并给出修复方案:

1. 重复定义command函数引发逻辑冲突

你写了两个command函数:第一个是处理按钮样式的短函数,第二个是生成命令的长函数。在JavaScript里,后定义的函数会直接覆盖前一个,这就导致第一个函数里的event.preventDefault()彻底失效——点击按钮时表单会默认提交、页面刷新,看起来代码"完全无法工作"。

2. 变量拼写错误触发ReferenceError

在循环的else分支中,你误用了未定义的变量x_position_turn_count,正确的变量名应该是command_x_position_turn_count2。这个错误会让代码执行到此处直接中断,输入数字后循环会触发这个分支,所以代码彻底停摆。

3. 表单输入未转数字+未处理空值

horizontal_speeddensity获取的是表单输入的字符串值,直接用于循环条件(i <= horizontal_speed)会导致类型判断异常;如果用户未输入内容,这两个值是空字符串,循环根本不会执行,自然inserted_command是空的,无法整合到final_command里。

4. 未处理placeholder默认值

当用户没填写horizontal_speeddensity时,应该自动使用placeholder里的默认值60,否则空值会导致循环不执行或计算出错。


修复后的完整代码

<form id="form" oninput="checkChange()" onchange="checkChange()"> 
    Particle<br> 
    <div class="select" style="margin:auto;"> 
        <select id="particle"> 
            <option value="angryVillager">angryVillager</option>
            <option value="barrier">barrier</option>
            <option value="blockcrack">blockcrack</option>
            <option value="blockdust">blockdust</option>
            <option value="bubble">bubble</option>
            <option value="cloud">cloud</option>
            <option value="crit">crit</option>
            <option value="damageIndicator">damageIndicator</option>
            <option value="depthsuspend">depthsuspend</option>
            <option value="dragonbreath">dragonbreath</option>
            <option value="dripLava">dripLava</option>
            <option value="dripWater">dripWater</option>
            <option value="droplet">droplet</option>
            <option value="enchantmenttable">enchantmenttable</option>
            <option value="endRod">endRod</option>
            <option value="explode">explode</option>
            <option value="fallingdust">fallingdust</option>
            <option value="fireworksSpark">fireworksSpark</option>
            <option value="flame">flame</option>
            <option value="footstep">footstep</option>
            <option value="happyVillager">happyVillager</option>
            <option value="heart">heart</option>
            <option value="hugeexplosion">hugeexplosion</option>
            <option value="iconcrack">iconcrack</option>
            <option value="instantSpell">instantSpell</option>
            <option value="largeexplode">largeexplode</option>
            <option value="largesmoke">largesmoke</option>
            <option value="lava">lava</option>
            <option value="magicCrit">magicCrit</option>
            <option value="mobSpell">mobSpell</option>
            <option value="mobSpellAmbient">mobSpellAmbient</option>
            <option value="mobappearance">mobappearance</option>
            <option value="note">note</option>
            <option value="portal">portal</option>
            <option value="reddust">reddust</option>
            <option value="splash">splash</option>
            <option value="suspended">suspended</option>
            <option value="sweepAttack">sweepAttack</option>
            <option value="take">take</option>
            <option value="totem">totem</option>
            <option value="townaura">townaura</option>
            <option value="wake">wake</option>
            <option value="witchMagic">witchMagic</option>
        </select> 
    </div><br><br> 
    Horizontal speed: particles per 360 degree rotation<br> 
    <input name="horizontal_speed" type="text" style="width:10%;" placeholder='60'><br><br> 
    Density: 1-20 particles per second<br> 
    <input name="density" type="text" style="width:10%;" placeholder='60'><br><br> 
    Entity tags<br> 
    <input name="entity_tags" type="text" style="width:90%;" placeholder='type=Player,name=Joeri'><br><br> 
    <textarea id="output" type="text" style="width:50%;" placeholder='output' rows="15" cols="70"></textarea> 
</form><br> 
<button id="submit" class="button" onclick="command(event)">Submit</button><br><br> 

<script> 
    const submitButton = document.getElementById('submit');
    
    function checkChange(){ 
        submitButton.style.background = 'rgba(90,90,90,1.0)'; 
    } 

    function command(event) { 
        event.preventDefault(); // 阻止表单默认提交,避免页面刷新
        submitButton.style.background = 'rgba(92,184,92,1)'; 

        const form = document.getElementById("form"); 
        const particle = form.elements["particle"].value; 
        let entity_tags = form.elements["entity_tags"].value; 
        // 处理密度:转数字,空值用默认60
        let density = parseInt(form.elements["density"].value) || 60;
        // 处理水平速度:转数字,空值用默认60
        let horizontal_speed = parseInt(form.elements["horizontal_speed"].value) || 60;

        if (entity_tags === ""){ 
            entity_tags = "type=Player"; 
        } 

        const command1 = '{id:commandblock_minecart,Command:"setblock ~command_x_position ~command_y_position ~ chain_command_block 5 replace {auto:1,Command:\"execute @e[score_horizontal_min=horizontal_score,score_horizontal=horizontal_score] ~ ~ ~ particle insert_particle ~particle_x_position ~1 ~particle_z_position 0 0 0 0.01 1 force\"}"}'; 
        const command2 = command1.replace('insert_particle', particle); 
        let inserted_command = ""; 
        let command_x_position_turn = 0; 
        let command_x_position_turn_count1 = 0; 
        let command_x_position_turn_count2 = 0; 

        for (let i = 1; i <= horizontal_speed; i++){ 
            const rad = (2 * i * Math.PI)/(horizontal_speed); 
            const particle_x_position = Math.round(Math.cos(rad) * 1000) / 1000; 
            const particle_z_position = Math.round(Math.sin(rad) * 1000) / 1000; 
            const horizontal_score = Math.round(1 + (i * (20/density))); 

            if(((i + 9) % 10) === 0){ 
                command_x_position_turn++; 
                if(i > 19){ 
                    command_x_position_turn_count2 += 2; 
                } 
            } else{ 
                command_x_position_turn--; 
                command_x_position_turn_count1 += 2; 
            } 

            let command_x_position;
            if(command_x_position_turn === 1){ 
                command_x_position = 2 + i - (command_x_position_turn_count1 * 10); 
            } else{ 
                // 修复变量拼写错误
                command_x_position = 23 - i + (command_x_position_turn_count2 * 10); 
            } 

            let add_x_position = command2.replace('particle_x_position', particle_x_position); 
            let add_z_position = add_x_position.replace('particle_z_position', particle_z_position); 
            let add_horizontal_score = add_z_position.replace('horizontal_score', horizontal_score); 
            let add_command_x_position = add_horizontal_score.replace('command_x_position', command_x_position); 
            // 每个命令块之间加逗号分隔,保证JSON格式正确
            inserted_command += add_command_x_position + ','; 
        } 
        // 移除最后一个多余的逗号,避免JSON语法错误
        inserted_command = inserted_command.slice(0, -1);

        let final_command = 'summon falling_block ~ ~1 ~ {Block:stone,Time:1,Passengers:[{id:falling_block,Block:redstone_block,Time:1,Passengers:[{id:falling_block,Block:activator_rail,Time:1,Passengers:[{id:commandblock_minecart,Command:"gamerule commandBlockOutput false"},{id:commandblock_minecart,Command:"scoreboard objectives add horizontal dummy"},' + '{id:commandblock_minecart,Command:"setblock ~2 ~-3 ~ repeating_command_block 5 replace {auto:0,Command:\"/scoreboard players add @e[insert_entity_tags] horizontal 10\"}"},{id:commandblock_minecart,Command:"setblock ~1 ~-3 ~ lever 2 replace"},' + inserted_command + ',{id:commandblock_minecart,Command:"setblock ~ ~ ~1 command_block 0 0 {Command:\"fill ~ ~-3 ~-1 ~ ~ ~ air\"}"},{id:commandblock_minecart,Command:"setblock ~ ~-1 ~1 redstone_block"},{id:commandblock_minecart,Command:"minecraft:kill @e[type=commandblock_minecart,r=1]"}]}]}]}'; 
        const final_command_inserted_entitytags = final_command.replace('insert_entity_tags', entity_tags); 

        document.getElementById('output').value = final_command_inserted_entitytags; 
    } 
</script>

额外优化说明

  • 给按钮的onclick传递了event参数,确保event.preventDefault()能正常阻止表单提交。
  • 修复了循环中的变量拼写错误,保证循环逻辑完整执行。
  • 将表单输入转为数字类型,空值时自动使用placeholder的默认值,确保循环能正常运行。
  • 拼接命令时添加了逗号分隔符,并移除最后一个多余逗号,避免生成的MC命令出现JSON语法错误。

内容的提问来源于stack exchange,提问作者awesomeguy

火山引擎 最新活动