全局变量只调用一次然后失去它们的作用域

Global Variables only Called Once then Lost their Scope

我的脚本有问题,希望能帮助我,在此先感谢,我仍在学习 javascript 并尝试每天学习一些新东西,我有一个脚本可以绘制无模式界面(调色板)和有按钮包括(选项)制作另一个新的调色板(用于选项),我将变量作为选项调色板的全局变量,但问题是全局变量只被调用一次!,并且脚本失去了全局变量范围!。

enter image description here

所以我的问题是如何使变量不失去其范围并保留在内存中?只要脚本 运行,例如,如果用户移动滑块并点击(显示警报到期选项)它仅 运行 一次然后失去范围,即使滑块也不再与用户交互并更新文本框,请测试代码以查看问题,再次感谢您的帮助或建议。

最佳 M.Hasanain

//Global Variables only Called Once then Lost their Scope!
#targetengine "session1";
var w = new Window("palette", {independent:true}); //Main Palette Windows
var findoptions = new Window("palette"); //Options Palette

function Main() {
    // Check to see whether any InDesign documents are open.
    // If no documents are open, display an error message.
    if (app.documents.length > 0) {
        var myDoc = app.activeDocument;
    }else{
        // No documents are open, so display an error message.
        alert("No InDesign documents are open. Please open a document and try again.");
    }
}

//---------------------------------------------------------
//Making Palettes Windows
//---------------------------------------------------------
#targetengine "session1";
var w = new Window("palette", {independent:true}); //Main Palette Windows
var findoptions = new Window("palette"); //Options Palette
//gqmanager is the (GREP Query Manager) outside the main Function
w.text = "Test the Connection Between Global Variables and Palettes";
w.preferredSize.width = 500;
w.alignChildren = ["center", "center"];  //"left";
w.orientation = "column"; //"row"; 
w.spacing = 10;
w.margins = 16;

//Parent - Input Panel Prepare
var InputPanel = w.add("panel", undefined, undefined, { name: "panel1" });
InputPanel.text = "Text Find : ";
InputPanel.preferredSize.width = 1000;
InputPanel.orientation = "row";
InputPanel.alignChildren = ["center", "center"];
InputPanel.spacing = 10;
InputPanel.margins = 16;

//Children -  input Panel Inside Prepare
var myInputPanelInside = InputPanel.add("group", undefined, { name: "myInput" });
//--Adding Find What
myInputPanelInside.add("statictext", undefined, "Find What :");
//myInputPanelInside.alignment = "center";
var myGREPString = myInputPanelInside.add("edittext", undefined, "SAMPLE");
myGREPString.helpTip = "Enter Your Text"
myGREPString.characters = 20;
myGREPString.enabled = true;
myGREPString.preferredSize.width = 460;

var Button1 = myInputPanelInside.add("button", undefined, "Options");

//Parent - Radio Panel Prepare
var RadioPanel = w.add("panel", undefined, undefined, { name: "panel2" });
RadioPanel.text = "Select Desired Option : ";
RadioPanel.preferredSize.width = 1000;
RadioPanel.orientation = "row";
RadioPanel.alignChildren = ["center", "center"];
RadioPanel.spacing = 10;
RadioPanel.margins = 16;

//Children -  input Panel Inside Prepare
var myRadioPanelInside = RadioPanel.add("group", undefined, { name: "myRadio" });
myRadioPanelInside.preferredSize.width = 500;
myRadioPanelInside.alignChildren = ["center", "center"];

//Adding Radio Buttons 
var radio1 = myRadioPanelInside.add("radiobutton", undefined, "Option 1");
var radio2 = myRadioPanelInside.add("radiobutton", undefined, "Option 2");
var radio3 = myRadioPanelInside.add("radiobutton", undefined, "Option 3");
radio1.preferredSize.width = 200;
radio2.preferredSize.width = 200;
radio3.preferredSize.width = 200;
//Previous Default Condition
radio1.value = true;

var myButtonGroup = w.add("group");
myButtonGroup.alignment = "center";

var Button2 = myButtonGroup.add("button", undefined, "Show Alert Due Options");
var Button3 = myButtonGroup.add("button", undefined, "Exit");

Button1.onClick = function () {
    CalltheFindOptions();
    }
Button2.onClick = function () { Find(); };
function Find() {
    doRadioButtonOpt();
}

Button3.onClick = function() {Canceled();};
function Canceled() {
    ExitSure();
}

//After Drawing Interface
var a = w.show();

function ExitSure() {
  var a = w.close();
  exit(0);
}

//User Selection for Radio Buttons
function doRadioButtonOpt() {
    myDoc = app.activeDocument; 
  if (radio1.value == true) {
    TestVars();
    }
}

function TestVars() {
    #targetengine "session1";
    var myDoc = app.activeDocument
    var TimeMs = Number(SliderControlText.text); //Converting Text to Number
    //Show Results Found as User Wish
if (DontShowResults.value == true) { //no Show only Apply
    alert("you Select not to Show Results!");
            }else{ //Direct Show and Apply
        if (ShowResultsDirect.value == true) {
    alert("you Select to Show Results in real time!");
            }else{ //Show and Apply By WaitinhTime!
                if (ShowResults.value == true) { //Show and Apply
            alert("you Select to Show Results with Specific time!");
            $.sleep(TimeMs); //Wait ms
                    }
                }
            }
alert("Do you need somthing else?, try again", "Finish Report");
}

var DontShowResults; 
var ShowResultsDirect; 
var ShowResults; 
var SliderControlText;
var slider;
//--------------------------------------------Building the Find Options Palette-----------------------------------------//
//--------------------------------------------------------------------------------------------------------------------------------//
function CalltheFindOptions() {
#targetengine "session1";
//Find Options Window
findoptions.text = "Find Options";
//Parent - Input Panel Prepare
SelectPanel = findoptions.add("panel", undefined, undefined, { name: "panel1" });
SelectPanel.text = " Find Options : ";
SelectPanel.preferredSize.width = 1000;
SelectPanel.orientation = "row";
SelectPanel.alignChildren = ["center", "center"];
SelectPanel.spacing = 10;
SelectPanel.margins = 16;

//Children -  input Panel Inside Prepare
mySelectPanelInside = SelectPanel.add("group", undefined, { name: "mySelOpt" });
DontShowResults = mySelectPanelInside.add("checkbox", undefined, "Don't Show Results");
DontShowResults.value = true; //by Default
DontShowResults.alignment = "left"; 

ShowResultsDirect = mySelectPanelInside.add("checkbox", undefined, "Show Results");
ShowResultsDirect.value = false; //by Default

ShowResults = mySelectPanelInside.add("checkbox", undefined, "Show Results Delayed in milliseconds(Ms) :");
ShowResults.value = false; //by Default

//Adding Slider to Control MS Time
SliderControlText = mySelectPanelInside.add ("edittext", undefined, 10, {readonly: false}); //read only prevent user Entering Nums
SliderControlText.characters = 3;
slider = mySelectPanelInside.add ("slider {minvalue: 1, maxvalue: 100, value: 10}");

//Slider Listener Plus SliderControl Text Listener
slider.onChanging = function () {SliderControlText.text = slider.value;} //Listen to Slider
var c = findoptions.show();
}

如果我对您的理解正确,您需要使用值而不是对象作为全局变量。您可以通过 onClick 事件更改全局变量的值。

这是代码的底部(代码的其余部分未更改):

...

function TestVars() {
    #targetengine "session1";
    var myDoc = app.activeDocument
    var TimeMs = Number(SliderControlText_text); //Converting Text to Number
    //Show Results Found as User Wish
    if (DontShowResults_value == true) { //no Show only Apply
        alert("you Select not to Show Results!");
    } else { //Direct Show and Apply
        if (ShowResultsDirect_value == true) {
            alert("you Select to Show Results in real time!");
        } else { //Show and Apply By WaitinhTime!
            if (ShowResults_value == true) { //Show and Apply
                alert("you Select to Show Results with Specific time!");
                $.sleep(TimeMs); //Wait ms
            }
        }
    }
    alert("Do you need somthing else?, try again", "Finish Report");
}

// values! not objects
var DontShowResults_value   = true;
var ShowResultsDirect_value = false;
var ShowResults_value       = false;
var SliderControlText_text  = '10';
var slider_value            = 10;
//--------------------------------------------Building the Find Options Palette-----------------------------------------//
//--------------------------------------------------------------------------------------------------------------------------------//
function CalltheFindOptions() {
    #targetengine "session1";
    //Find Options Window
    findoptions.text = "Find Options";
    //Parent - Input Panel Prepare
    SelectPanel = findoptions.add("panel", undefined, undefined, {
        name: "panel1"
    });
    SelectPanel.text = " Find Options : ";
    SelectPanel.preferredSize.width = 1000;
    SelectPanel.orientation = "row";
    SelectPanel.alignChildren = ["center", "center"];
    SelectPanel.spacing = 10;
    SelectPanel.margins = 16;

    //Children -  input Panel Inside Prepare
    var mySelectPanelInside = SelectPanel.add("group", undefined, {
        name: "mySelOpt"
    });
    var DontShowResults = mySelectPanelInside.add("checkbox", undefined, "Don't Show Results");
    DontShowResults.value = DontShowResults_value; //by Default
    DontShowResults.alignment = "left";
    // change the global variable by click
    DontShowResults.onClick = function() { DontShowResults_value = DontShowResults.value }

    var ShowResultsDirect = mySelectPanelInside.add("checkbox", undefined, "Show Results");
    ShowResultsDirect.value = false; //by Default

    // change the global variable by click
    ShowResultsDirect.onClick = function() { ShowResultsDirect_value = ShowResultsDirect.value }

    var ShowResults = mySelectPanelInside.add("checkbox", undefined, "Show Results Delayed in milliseconds(Ms) :");
    ShowResults.value = ShowResults_value; //by Default

    // change the global variable by click
    ShowResults.onClick = function() { ShowResults_value = ShowResults.value }

    //Adding Slider to Control MS Time
    // SliderControlText = mySelectPanelInside.add("edittext", undefined, 10, {
    var SliderControlText = mySelectPanelInside.add("edittext", undefined, SliderControlText_text, {
        readonly: false
    }); //read only prevent user Entering Nums
    SliderControlText.characters = 3;
    var slider = mySelectPanelInside.add("slider {minvalue: 1, maxvalue: 100, value: 10}");

    // change slider every time as numbers is changes
    SliderControlText.onChanging = function() {slider.value = SliderControlText.text};

    //Slider Listener Plus SliderControl Text Listener
    slider.onChanging = function () {
        SliderControlText.text = slider.value;

        // change the global variable by onChange
        SliderControlText_text = SliderControlText.text;
    } //Listen to Slider

    findoptions.show();
}

它似乎按预期工作。

据我所知(我可能是错的),问题的原因是对象 ShowResultsDirectShowResultsDirect 等在您关闭调色板后立即消失。因为它们是调色板的元素。如果调色板关闭,它们将无法保留值。这就是为什么它们只有在您第一次打开调色板时才能正常工作。