Επιλεκτικό άνοιγμα js αρχείου

Κώδικας, πληροφορίες, ερωτήσεις και απαντήσεις σχετικές με την JavaScript.

Συντονιστές: WebDev Moderators, Super-Moderators

Απάντηση
Άβαταρ μέλους
skeftomilos
Script Master
Δημοσιεύσεις: 2888
Εγγραφή: 07 Ιαν 2005 07:22
Τοποθεσία: Αθήνα

Επιλεκτικό άνοιγμα js αρχείου

Δημοσίευση από skeftomilos » 13 Ιουν 2005 08:31

Η JavaScript είναι γλώσσα με αρκετές εφαρμογές, και αυτό είναι βέβαια ένα από τα δυνατά της σημεία. Ωστόσο μπορεί να δημιουργήσει πρόβλημα όταν θέλουμε να ανοίγουμε τα διάφορα αρχεία js με διαφορετικά προγράμματα. Για παράδειγμα όταν κάνουμε διπλό κλικ στο παρακάτω αρχείο (Hello.js) θέλουμε να το τρέχει άμεσα ο Windows Script Host (WSH):

Κώδικας: Επιλογή όλων

WScript.Echo("Hello World from JS!")
Εικόνα

Όταν όμως κάνουμε διπλό κλικ στο παρακάτω (Time.js) θέλουμε να ανοίγει στον αγαπημένο μας editor (π.χ. Notepad):

Κώδικας: Επιλογή όλων

window.display_time = function() {
  alert(new Date().toLocaleString())
}
Εικόνα

Αυτό το αρχείο προορίζεται να γίνει include σε μία σελίδα html (<script src="Time.js"></script>) και επομένως δεν έχει νόημα να τρέξει με τον WSH. Αν δοκιμάσουμε κάτι τέτοιο, το πιθανότερο είναι να πάρουμε ένα μήνυμα σφάλματος:

Εικόνα

Το ζητούμενο είναι λοιπόν να ανοίγουμε τα js αρχεία διαφορετικού περιεχομένου με διαφορετικά προγράμματα. Αρχικά δε φαίνεται να είναι σοβαρό πρόβλημα. Μπορούμε πάντα να κάνουμε δεξί κλικ και edit για να ανοίξουμε ένα αρχείο στον editor, και να κρατήσουμε ως default ενέργεια το τρέξιμο με τον WSH. Όμως υπάρχουν περιπτώσεις που τα αρχεία χρησιμοποιούνται με ειδικό τρόπο, και δεν έχουμε αυτή την επιλογή. Για παράδειγμα αν βάλουμε scripts στο φάκελο SendTo, για να λειτουργήσει αυτή η τεχνική πρέπει το default άνοιγμα να είναι ο WSH. (Αν δεν ξέρετε την τεχνική SendTo, δείτε το Φτιάξτε μόνοι σας χρήσιμα utilities με JavaScript). Από την άλλη αν θέλουμε να διορθώνουμε εύκολα τα Greasemonkey scripts πρέπει το default άνοιγμα των αρχείων .user.js να είναι ο editor. Problem!

Εικόνα

Μία λύση είναι να δημιουργήσουμε μία διαφορετική κατάληξη για τα WSH scripts, π.χ. jsw. Δεν είναι πολύ δύσκολο, αρκεί να δημιουργήσουμε ένα κλειδί στο registry με default τιμή JSFile:

Εικόνα

Μετά αρκεί να ορίσουμε διαφορετικό τρόπο ανοίγματος για κάθε κατάληξη, και να αλλάξουμε την κατάληξη όλων των Windows scripts που έχουμε σε jsw. Αυτή η λύση δεν είναι και τόσο άσχημη, άλλα φυσικά θα προτιμούσαμε κάτι απλούστερο. Μια άλλη ιδέα θα ήταν να αναθέταμε σε ένα πρόγραμμα να τρέξει τα scripts μας με τον κατάλληλο κατά περίπτωση τρόπο. Το πρόγραμμα θα μπορούσε να εξετάζει το περιεχόμενο του αρχείου και να μαντεύει αν πρόκειται για WSH script ή Web script. Πώς θα μπορούσε να γίνει αυτός ο διαχωρισμός; Μάλλον εύκολα. Είναι βέβαιο ότι ένα WSH script θα περιέχει τη λέξη WScript, ενώ αντίθετα είναι απίθανο να την περιέχει ένα Web script. Όσο για το πρόγραμμα, δεν υπάρχει κανένας λόγος να μην είναι το ίδιο ένα script!

Κώδικας: Επιλογή όλων

if &#40;WScript.Arguments.Length != 1&#41; &#123;
  WScript.Echo&#40;WScript.ScriptName + "\r\nOne and only one argument supported."&#41;
  WScript.Quit&#40;&#41;
&#125;

var file_name = WScript.Arguments&#40;0&#41;
var fso = WScript.CreateObject&#40;"Scripting.FileSystemObject"&#41;

if &#40;!fso.FileExists&#40;file_name&#41;&#41; &#123;
  WScript.Echo&#40;"File not found&#58; " + file_name&#41;
  WScript.Quit&#40;&#41;
&#125;

var shell = WScript.CreateObject&#40;"WScript.Shell"&#41;
var file = fso.GetFile&#40;file_name&#41;

var re_user_script = /\.user\.js$/
if &#40;re_user_script.test&#40;file.Name&#41;&#41; &#123;
  shell.Run&#40;'Notepad.exe "' + file.Path + '"'&#41;
  WScript.Quit&#40;&#41;
&#125;

var stream = file.OpenAsTextStream&#40;1, 0&#41; // ForReading, ASCII.
var source = stream.ReadAll&#40;&#41;
stream.Close&#40;&#41;

var re_wscript = /WScript\./

if &#40;re_wscript.test&#40;source&#41;&#41; &#123;
  shell.Run&#40;'WScript.exe "' + file.Path + '"'&#41;
&#125; else &#123;
  shell.Run&#40;'Notepad.exe "' + file.Path + '"'&#41;
&#125;
Αποθηκεύουμε το παραπάνω script κάπου μόνιμα και του δίνουμε κατάληξη .js, π.χ. JScript-Launcher.js. Τώρα πρέπει να κάνουμε τις απαραίτητες ρυθμίσεις ώστε τα js αρχεία να τρέχουν με αυτό το script. Θα χρειαστεί να μπλέξουμε λίγο με τις Folder Options του Windows Explorer, γιατί είναι χειρότερο να μπλέξουμε απευθείας με το registry. Λοιπόν:

- Windows Explorer -> Tools -> Folder Options
- File Types -> JS - JScript Script File
- Κουμπί Advanced
- Actions -> New
- Action: Launch
- Application used to perform action: WScript.exe "D:\Scripts\JScript-Launcher.js" "%1" %*
- Ok -> Set Default

Στο προτελευταίο βήμα υπάρχει η διεύθυνση του script. Διορθώστε την αν χρειάζεται.

Εικόνα

Εικόνα

Είμαστε έτοιμοι! Τώρα έχει προστεθεί μία επιπλέον επιλογή στο context μενού των αρχείων js, η επιλογή Launch, η οποία μάλιστα είναι η προεπιλεγμένη. Όταν κάνουμε διπλό κλικ στα μικρά js αρχεία που δοκιμάσαμε στην αρχή, θα δούμε το ένα να ανοίγει έτσι και το άλλο αλλιώς. Αυτό που θέλαμε δηλαδή!

Εικόνα

Ας δούμε λίγο πιο προσεχτικά τη διαδικασία για να καταλάβουμε τι κάναμε. Η εντολή κλειδί είναι αυτή που γράψαμε ως action στα Folder Options:

Κώδικας: Επιλογή όλων

WScript.exe "D&#58;\Scripts\JScript-Launcher.js" "%1" %*
Μόλις κάνουμε διπλό κλικ στο αρχείο Hello.js, τα windows εκτελούν την παρακάτω DOS εντολή:

Κώδικας: Επιλογή όλων

WScript.exe "D&#58;\Scripts\JScript-Launcher.js" "D&#58;\Test\Hello.js"
Το πρόγραμμα WScript.exe είναι ο θεμελιώδης λίθος του οικοδομήματος Windows Scriptng Host. Περιμένει ως πρώτη παράμετρο να πάρει ένα script, και πράγματι εδώ έχει ένα. Από την κατάληξη του αρχείου καταλαβαίνει ότι είναι JScript και ξεκινά την αντίστοιχη Script Engine (θα μπορούσε να είναι και VBScript). Η Engine ξεκινά την εκτέλεση του script JScript-Launcher.js, έχοντας τοποθετήσει το όνομα D:\Test\Hello.js στη συλλογή WScript.Arguments. Η συλλογή επομένως περιέχει ένα στοιχείο, και άρα ισχύει WScript.Arguments.Length == 1. Η εκτέλεση του script θα καταλήξει σε μία από τις εξής δύο εντολές:

Κώδικας: Επιλογή όλων

shell.Run&#40;'Notepad.exe "' + file.Path + '"'&#41;
shell.Run&#40;'WScript.exe "' + file.Path + '"'&#41;
Η πρώτη ανοίγει το αρχείο Hello.js στο Notepad και αμέσως τερματίζει. Θα μπορούσαμε να κοιτάξουμε στο Registry για το επιλεγμένο πρόγραμμα editor, αλλά ας μην το κάνουμε τόσο περίπλοκο. Η δεύτερη ξανατρέχει το WScript.exe, αυτή τη φορά όμως με το script Hello.js ως πρώτη παράμετρο. Η εκτέλεση του πρώτου script τερματίζει ενώ παράλληλα ξεκινά η εκτέλεση του δεύτερου. Με λίγα λόγια το WScript.exe τρέχει δύο φορές, σε διαφορετικές και ανεξάρτητες processes. Αυτό προκαλεί μία απειροελάχιστη καθυστέρηση, η οποία είναι μάλλον και το μοναδικό μειονέκτημα αυτής της τεχνικής. Μέχρι στιγμής δεν έχω συναντήσει άλλα προβλήματα.

Για το τέλος ας δούμε το κλειδί που προστέθηκε στο Registry ως αποτέλεσμα των ενεργειών μας στα Folder Options:

Εικόνα
The pure and simple truth is rarely pure and never simple. Ο μη νους δε σκέπτεται μη σκέψεις για το τίποτα.

Άβαταρ μέλους
cordis
Administrator, [F|H]ounder, [C|S]EO
Δημοσιεύσεις: 27622
Εγγραφή: 09 Οκτ 1999 03:00
Τοποθεσία: Greece
Επικοινωνία:

Επιλεκτικό άνοιγμα js αρχείου

Δημοσίευση από cordis » 13 Ιουν 2005 14:47

Για άλλη μια φορά.. πολύ καλός... :P
Δεν απαντάω σε προσωπικά μηνύματα με ερωτήσεις που καλύπτονται από τις ενότητες του forum. Για ο,τι άλλο είμαι εδώ για εσάς.
- follow me @twitter

Απάντηση

Επιστροφή στο “JavaScript και Frameworks”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 0 επισκέπτες