Adding removing options from drop downs can be down right annoying, but I came up with a simple prototype function that I think makes it a lot easier.
You just pass your select box object, an object with an enumerable-esque 'each' method, and a method for creating the individual options. On the advice of my wonderful co-worker Jim, you can pass an optional 4th argument that lets you maintain the options length. It's defaulted to 1 in order to preserve the first element in a drop down, which we typically leave blank.
Here's the function:
// Requires Prototype: http://www.prototypejs.org/
function setDropDown(field, data, method, index) {
field.options.length = index == null ? 1 : index;
data.each(
function(e) {
field.options.add(method(e));
}
);
}
And here are some quick examples:
To clear a drop down:
setDropDown(selectBoxObject,[]);
To copy items from one drop down to another:
setDropDown(
selectBoxObject,
otherSelectBoxObject.options,
function(e) {
return new Option(e.text, e.value);
}
);
Quick example using JSON
var json = Object.toJSON( {"COUNTRIES":[{"COUNTRY":"Hong Kong","ID":1},{"COUNTRY":"Japan","ID":2}]} );
setDropDown(
selectBoxObject,
json.COUNTRIES,
function(e) {
return new Option( e.COUNTRY, e.ID );
}
);
Tags: javascript, prototype
I wrote a little script using ColdFusion and JavaScript to merge two NetFlix accounts. It's ugly and cheesy, but it works so I thought I'd share.
Here's how you do it:
<!--- enter your feed here! --->
<cfset feed = "http://rss.netflix.com/QueueRSS?id=P4806480653914107620156446228102116" />
<!--- enter your consumer key here! --->
<cfset key = "your-consumer-key-here" />
<cfset href = "http://widgets.netflix.com/addToQueue.jsp?output=json&devKey=#key#&queue_type=disc&movie_id=http://api.netflix.com/catalog/movie/" />
<cffeed action="read" name="queue" source="#feed#" />
<cfset movies = queue.item />
<cfset idList = "" />
<cfloop array="#movies#" index="i">
<cfset idList = ListAppend(idList,ListLast(i.guid.value,"/")) />
</cfloop>
<cfoutput>
<script src="http://ajax.googleapis.com/ajax/libs/prototype/1.6.0.3/prototype.js"/>
<--- Pop up a new window, swap the href every second. Told ya it was cheesy! --->
<script>
var popUp = window.open('http://google.com');
var idList = [#idList#];
new PeriodicalExecuter(
function(pe) {
if (idList.length == 0) {
pe.stop();
} else {
popUp.location.href = "#href#" + idList.pop();
}
},
1
);
</script>
</cfoutput>
Note: I don't know if this allowed by the EULA, or if there even is a EULA...so, use at your own risk!
Tags: coldfusion, javascript, netflix, prototype
I revisited my Event.observe proof of concept and tidied it up a bit with a little help from stackoverflow.com.
Here's how it do
This here defines a method to determine which method is currently running. There's a slicker way to do this in 1.9 and you can read about them both on stackoverflow.com.
module Kernel
private
def current_method_name
caller[0] =~ /`([^']*)'/ and $1
end
end
Here's my actual observer class, named after it's inspiration.
class Event
def initialize
@events = []
end
def observe object, method, callback
handle = Handle.new self, object, method, callback
@events << handle
handle
end
def delete handle
@events.delete handle
end
def call object, method
handle = Handle.new self, object, method
@events.each do |e|
e.call if e.shares_type_with
end
end
end
And finally there's a basic handle class:
class Handle attr_readerbserver,
bject, :method, :callback def initialize observer, object, method, callback = nil @observer = observer @object = object @method = method @callback = callback end def shares_type_with? handle object == handle.object && method == handle.method end def call callback.call end def stop_observing observer.delete self end end
And here's how you use it, In the following example we want our "second" Test_Object to run it's test_method whenever we run the same method for our "first" object.
The important thing here is the "notify" method, you'll need to drop this method into whatever you'd like to be able to observe. If you wanted to be able to observe everything you could always loop through the methods, alias and override.
class Test_Object
def initialize observer, label
@observer = observer
@label = label
end
def notify method
@observer.call self, method
end
def test_method
puts "Calling => #{@label}"
notify current_method_name
end
end
observer = Event.new
first = Test_Object.new observer, "First"
second = Test_Object.new observer, "Second"
h1 = observer.observe(
first,
"test_method",
second.method :test_method
)
first.test_method
# Calling First
# Calling Second
#=> nil
And we can drop the handle by simply calling it's stop_observing method
h1.stop_observing first.test_method # Calling First #=> nil
That's it.
Download the Proof of Concept!
Tags: javascript, prototype, ruby
I love Prototype. I wanted to implement something akin to Event.observe in some of the gui applications I've been playing with. The code's fugly, but it's a first pass and I just finished my last Netflix.
Example JavaScript Implementation is pretty:
a = new Test_Object( "First" )
b = new Test_Object( "Second" )
Event.observe(
a,
"test_method",
b.test_method
)
Event.observe(
b,
"test_method",
function(e) { new Test_Object("Third").test_method() }
)
Example Ruby Implementation..not so pretty.
$event = Event.new
a = Test_Object.new( "First" )
b = Test_Object.new( "Second" )
$event.observe(
a,
"test_method",
b.method( "test_method" )
)
$event.observe(
b,
"test_method",
Proc.new { Test_Object.new("Third").test_method }
)
a.test_method
Yep, that's a global. I'm still working on it. Any ideas would be welcome!
Tags: javascript, prototype, ruby
A co-worker of mine sent me some advice on the JavaScript deck of cards I set up a while back. Everything he said was spot on. Jim, if you're out there, you're insight and advice is always welcome and highly respected. Thanks!
Read your blog.
![]()
In the interest of academic feedback (don't take any of this in a negative way), I have a few comments.
It's hard to tell from the current function names, but if the "same_suit" and "same_type" Card methods are meant to be "is_same_..." functions, they you need to change the "=" to "==".
Card = Class.create({ initialize: function(type,suit) { this.type = type; this.suit = suit; }, same_suit: function(suit) { return this.suit == suit; }, same_type: function(type) { return this.type == type; }, toString: function(){ return this.type + ' of ' + this.suit; } });
JS supports the '+=' operator for strings, so you could change the "message = message + ..." to "message += ..." in the Deck::toString method.
The first time through the Deck::toString function, the modulo check will be true, resulting in message beginning with a '\n' character. Wasn't sure if that is what you wanted.
Here's a minor optimization for the Deck::toString function. It removes the modulo operation from the loop, which is performed 52 times on a full deck, and handles the all of the leading/trailing whitespace (tabs and newlines) automatically:
toString: function() { var message = ''; var i = 0, n = this.cards.length - 2; for(; i < n; ) { message += this.cards[i++] + '\t\t' + this.cards[i++] + '\n'; } if (i < this.cards.length) { message += this.cards[i++]; } if (i < this.cards.length) { message += '\t\t' + this.cards[i]; } return message; }
The following code:
var face_cards = "King,Queen,Jack" face_cards = face_cards.split(',');Could be:
var face_cards = ["King","Queen","Jack"];
I don't think you need the "var i" in the Deck::add_card method.
PS: One other minor update, I got started thinking about UNO and decided to break out the French or Anglo American deck specifications out to a separate class and file.
PPS: Jim caught me using a "=" in place of a "==". These were methods that I hadn't tried yet, but knew that I would need in the future. This is exactly the sort of thing that would have been instantly caught had I written out some tests. I'm a bit late to the game on TDD, but it's something I've been toying with in Ruby and I'm starting to come around. I don't even know where to start unit testing in JavaScript, but I plan on doing a bit of homework on the matter so stay tuned!
Download the code!
JavaScript Deck of Cards V2
Current Version
Tags: cards, javascript, prototype