تسريع مشاهدة اليوتيوب لمدونات بلوجر
الأن وبعد طول انتظار اتت لنا خاصية الHTML5 , لتساعدنا في سرعة مشاهدة الفيديوات
و الطريقة مضمونة و مجربة من قبلي شخصيا , و لا ننسى ان موضوع اليوم من مجهودي
</head>
<script type='text/javascript' charset='utf-8'>
document.observe("dom:loaded", function() { VideoJS.setup(); });
</script>
<div class="video-js-box">
<video class="video-js" width="ANCHO" height="ALTO" poster="http://4.bp.blogspot.com/_ZXEvc1YiIko/TDZZvBqLfpI/AAAAAAAAAbM/Fr5Q5XcybV8/s1600/09-07-2010+0-03-40.png" controls preload>
<source src="http://www.youtube.com/watch?v=Q2fhVnTuxv4" type='video/ogg; codecs="theora, vorbis"'>
</video>
</div>
<script type='text/javascript'>
//<![CDATA[
/*
This file is part of VideoJS. Copyright 2010 Zencoder, Inc.
VideoJS is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
VideoJS is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with VideoJS. If not, see <http://www.gnu.org/licenses/>.
*/
// Store a list of players on the page for reference
var videoJSPlayers = new Array();
// Using jresig's Class implementation http://ejohn.org/blog/simple-javascript-inheritance/
(function(){var initializing=false, fnTest=/xyz/.test(function(){xyz;}) ? /\b_super\b/ : /.*/; this.Class = function(){}; Class.extend = function(prop) { var _super = this.prototype; initializing = true; var prototype = new this(); initializing = false; for (var name in prop) { prototype[name] = typeof prop[name] == "function" && typeof _super[name] == "function" && fnTest.test(prop[name]) ? (function(name, fn){ return function() { var tmp = this._super; this._super = _super[name]; var ret = fn.apply(this, arguments); this._super = tmp; return ret; }; })(name, prop[name]) : prop[name]; } function Class() { if ( !initializing && this.init ) this.init.apply(this, arguments); } Class.prototype = prototype; Class.constructor = Class; Class.extend = arguments.callee; return Class;};})();
// Video JS Player Class
var VideoJS = Class.extend({
// Initialize the player for the supplied video tag element
// element: video tag
// num: the current player's position in the videoJSPlayers array
init: function(element, setOptions){
this.video = element;
// Hide default controls
this.video.controls = false;
// Default Options
this.options = {
num: 0, // Optional tracking of videoJSPLayers position
controlsBelow: false, // Display control bar below video vs. on top
controlsHiding: true, // Hide controls when not over the video
defaultVolume: 0.85, // Will be overridden by localStorage volume if available
flashVersion: 9, // Required flash version for fallback
linksHiding: true // Hide download links when video is supported
};
// Override default options with set options
if (typeof setOptions == "object") _V_.merge(this.options, setOptions);
this.box = this.video.parentNode;
this.flashFallback = this.getFlashFallback();
this.linksFallback = this.getLinksFallback();
// Hide download links if video can play
if(VideoJS.browserSupportsVideo() || ((this.flashFallback || VideoJS.isIE()) && this.flashVersionSupported())) {
this.hideLinksFallback();
}
// Check if browser can play HTML5 video
if (VideoJS.browserSupportsVideo()) {
// Force flash fallback when there's no supported source
if (this.canPlaySource() == false) {
this.replaceWithFlash();
return;
}
} else {
return;
}
// For iPads, controls need to always show because there's no hover
// The controls also have to be below for the full-window mode to work.
if (VideoJS.isIpad()) {
this.options.controlsBelow = true;
this.options.controlsHiding = false;
}
if (this.options.controlsBelow) {
_V_.addClass(this.box, "vjs-controls-below");
}
// Store amount of video loaded
this.percentLoaded = 0;
this.buildPoster();
this.showPoster();
this.buildController();
this.showController();
// Position & show controls when data is loaded
this.video.addEventListener("loadeddata", this.onLoadedData.context(this), false);
// Listen for when the video is played
this.video.addEventListener("play", this.onPlay.context(this), false);
// Listen for when the video is paused
this.video.addEventListener("pause", this.onPause.context(this), false);
// Listen for when the video ends
this.video.addEventListener("ended", this.onEnded.context(this), false);
// Listen for a volume change
this.video.addEventListener('volumechange',this.onVolumeChange.context(this),false);
// Listen for video errors
this.video.addEventListener('error',this.onError.context(this),false);
// Listen for Video Load Progress (currently does not if html file is local)
this.video.addEventListener('progress', this.onProgress.context(this), false);
// Set interval for load progress using buffer watching method
this.watchBuffer = setInterval(this.updateBufferedTotal.context(this), 33);
// Listen for clicks on the play/pause button
this.playControl.addEventListener("click", this.onPlayControlClick.context(this), false);
// Make a click on the video act like a click on the play button.
this.video.addEventListener("click", this.onPlayControlClick.context(this), false);
// Make a click on the poster act like a click on the play button.
if (this.poster) this.poster.addEventListener("click", this.onPlayControlClick.context(this), false);
// Listen for drags on the progress bar
this.progressHolder.addEventListener("mousedown", this.onProgressHolderMouseDown.context(this), false);
// Listen for a release on the progress bar
this.progressHolder.addEventListener("mouseup", this.onProgressHolderMouseUp.context(this), false);
// Set to stored volume OR 85%
this.setVolume(localStorage.volume || this.options.defaultVolume);
// Listen for a drag on the volume control
this.volumeControl.addEventListener("mousedown", this.onVolumeControlMouseDown.context(this), false);
// Listen for a release on the volume control
this.volumeControl.addEventListener("mouseup", this.onVolumeControlMouseUp.context(this), false);
// Set the display to the initial volume
this.updateVolumeDisplay();
// Listen for clicks on the button
this.fullscreenControl.addEventListener("click", this.onFullscreenControlClick.context(this), false);
// Listen for the mouse move the video. Used to reveal the controller.
this.video.addEventListener("mousemove", this.onVideoMouseMove.context(this), false);
// Listen for the mouse moving out of the video. Used to hide the controller.
this.video.addEventListener("mouseout", this.onVideoMouseOut.context(this), false);
// Listen for the mouse move the poster image. Used to reveal the controller.
if (this.poster) this.poster.addEventListener("mousemove", this.onVideoMouseMove.context(this), false);
// Listen for the mouse moving out of the poster image. Used to hide the controller.
if (this.poster) this.poster.addEventListener("mouseout", this.onVideoMouseOut.context(this), false);
// Have to add the mouseout to the controller too or it may not hide.
// For some reason the same isn't needed for mouseover
this.controls.addEventListener("mouseout", this.onVideoMouseOut.context(this), false);
// Create listener for esc key while in full screen mode
// Creating it during initialization to add context
// and because it has to be removed with removeEventListener
this.onEscKey = function(event){
if (event.keyCode == 27) {
this.fullscreenOff();
}
}.context(this);
this.onWindowResize = function(event){
this.positionController();
}.context(this);
// Support older browsers that used autobuffer
this.fixPreloading()
},
// Support older browsers that used "autobuffer"
fixPreloading: function(){
if (typeof this.video.hasAttribute == "function" && this.video.hasAttribute("preload")) {
this.video.autobuffer = true;
}
},
buildController: function(){
/* Creating this HTML
<ul class="vjs-controls">
<li class="vjs-play-control vjs-play">
<span></span>
</li>
<li class="vjs-progress-control">
<ul class="vjs-progress-holder">
<li class="vjs-load-progress"></li>
<li class="vjs-play-progress"></li>
</ul>
</li>
<li class="vjs-time-control">
<span class="vjs-current-time-display">00:00</span><span> / </span><span class="vjs-duration-display">00:00</span>
</li>
<li class="vjs-volume-control">
<ul>
<li></li><li></li><li></li><li></li><li></li><li></li>
</ul>
</li>
<li class="vjs-fullscreen-control">
<ul>
<li></li><li></li><li></li><li></li>
</ul>
</li>
</ul>
*/
// Create a list element to hold the different controls
this.controls = _V_.createElement("ul", { className: "vjs-controls" });
// Add the controls to the video's container
this.video.parentNode.appendChild(this.controls);
// Build the play control
this.playControl = _V_.createElement("li", { className: "vjs-play-control vjs-play", innerHTML: "<span></span>" });
this.controls.appendChild(this.playControl);
// Build the progress control
this.progressControl = _V_.createElement("li", { className: "vjs-progress-control" });
this.controls.appendChild(this.progressControl);
// Create a holder for the progress bars
this.progressHolder = _V_.createElement("ul", { className: "vjs-progress-holder" });
this.progressControl.appendChild(this.progressHolder);
// Create the loading progress display
this.loadProgress = _V_.createElement("li", { className: "vjs-load-progress" });
this.progressHolder.appendChild(this.loadProgress)
// Create the playing progress display
this.playProgress = _V_.createElement("li", { className: "vjs-play-progress" });
this.progressHolder.appendChild(this.playProgress);
// Create the progress time display (00:00 / 00:00)
this.timeControl = _V_.createElement("li", { className: "vjs-time-control" });
this.controls.appendChild(this.timeControl);
// Create the current play time display
this.currentTimeDisplay = _V_.createElement("span", { className: "vjs-current-time-display", innerHTML: "00:00" });
this.timeControl.appendChild(this.currentTimeDisplay);
// Add time separator
this.timeSeparator = _V_.createElement("span", { innerHTML: " / " });
this.timeControl.appendChild(this.timeSeparator);
// Create the total duration display
this.durationDisplay = _V_.createElement("span", { className: "vjs-duration-display", innerHTML: "00:00" });
this.timeControl.appendChild(this.durationDisplay);
// Create the volumne control
this.volumeControl = _V_.createElement("li", {
className: "vjs-volume-control",
innerHTML: "<ul><li></li><li></li><li></li><li></li><li></li><li></li></ul>"
});
this.controls.appendChild(this.volumeControl);
this.volumeDisplay = this.volumeControl.children[0]
// Crete the fullscreen control
this.fullscreenControl = _V_.createElement("li", {
className: "vjs-fullscreen-control",
innerHTML: "<ul><li></li><li></li><li></li><li></li></ul>"
});
this.controls.appendChild(this.fullscreenControl);
},
// Get the download links block element
getLinksFallback: function(){
return this.box.getElementsByTagName("P")[0];
},
// Hide no-video download paragraph
hideLinksFallback: function(){
if (this.options.linksHiding && this.linksFallback) this.linksFallback.style.display = "none";
},
getFlashFallback: function(){
if (VideoJS.isIE()) return;
var children = this.box.getElementsByClassName("vjs-flash-fallback");
for (var i=0,j=children.length; i<j; i++) {
if (children[i].tagName.toUpperCase() == "OBJECT") {
return children[i];
}
}
},
replaceWithFlash: function(){
// this.flashFallback = this.video.removeChild(this.flashFallback);
if (this.flashFallback) {
this.box.insertBefore(this.flashFallback, this.video);
this.video.style.display = "none"; // Removing it was breaking later players
}
},
// Show the controller
showController: function(){
this.controls.style.display = "block";
this.positionController();
},
// Place controller relative to the video's position
positionController: function(){
// Make sure the controls are visible
if (this.controls.style.display == 'none') return;
if (this.videoIsFullScreen) {
this.box.style.width = "";
} else {
this.box.style.width = this.video.offsetWidth + "px";
}
if (this.options.controlsBelow) {
if (this.videoIsFullScreen) {
this.box.style.height = "";
this.video.style.height = (this.box.offsetHeight - this.controls.offsetHeight) + "px";
} else {
this.video.style.height = "";
this.box.style.height = this.video.offsetHeight + this.controls.offsetHeight + "px";
}
this.controls.style.top = this.video.offsetHeight + "px";
} else {
this.controls.style.top = (this.video.offsetHeight - this.controls.offsetHeight) + "px";
}
this.sizeProgressBar();
},
// Hide the controller
hideController: function(){
if (this.options.controlsHiding) this.controls.style.display = "none";
},
// Update poster source from attribute or fallback image
// iPad breaks if you include a poster attribute, so this fixes that
updatePosterSource: function(){
if (!this.video.poster) {
var images = this.video.getElementsByTagName("img");
if (images.length > 0) this.video.poster = images[0].src;
}
},
buildPoster: function(){
this.updatePosterSource();
if (this.video.poster) {
this.poster = document.createElement("img");
// Add poster to video box
this.video.parentNode.appendChild(this.poster);
// Add poster image data
this.poster.src = this.video.poster;
// Add poster styles
this.poster.className = "vjs-poster";
} else {
this.poster = false;
}
},
// Add the video poster to the video's container, to fix autobuffer/preload bug
showPoster: function(){
if (!this.poster) return;
this.poster.style.display = "block";
this.positionPoster();
},
// Size the poster image
positionPoster: function(){
// Only if the poster is visible
if (this.poster == false || this.poster.style.display == 'none') return;
this.poster.style.height = this.video.offsetHeight + "px";
this.poster.style.width = this.video.offsetWidth + "px";
},
hidePoster: function(){
if (!this.poster) return;
this.poster.style.display = "none";
},
canPlaySource: function(){
var children = this.video.children;
for (var i=0,j=children.length; i<j; i++) {
if (children[i].tagName.toUpperCase() == "SOURCE") {
var canPlay = this.video.canPlayType(children[i].type);
if(canPlay == "probably" || canPlay == "maybe") {
return true;
}
}
}
return false;
},
// When the video is played
onPlay: function(event){
this.playControl.className = "vjs-play-control vjs-pause";
this.hidePoster();
this.trackPlayProgress();
},
// When the video is paused
onPause: function(event){
this.playControl.className = "vjs-play-control vjs-play";
this.stopTrackingPlayProgress();
},
// When the video ends
onEnded: function(event){
this.video.pause();
this.onPause();
},
onVolumeChange: function(event){
this.updateVolumeDisplay();
},
onError: function(event){
console.log(event);
console.log(this.video.error);
},
onLoadedData: function(event){
this.showController();
},
// When the video's load progress is updated
// Does not work in all browsers (Safari/Chrome 5)
onProgress: function(event){
if(event.total > 0) {
this.setLoadProgress(event.loaded / event.total);
}
},
// Buffer watching method for load progress.
// Used for browsers that don't support the progress event
updateBufferedTotal: function(){
if (this.video.buffered) {
if (this.video.buffered.length >= 1) {
this.setLoadProgress(this.video.buffered.end(0) / this.video.duration);
if (this.video.buffered.end(0) == this.video.duration) {
clearInterval(this.watchBuffer);
}
}
} else {
clearInterval(this.watchBuffer);
}
},
setLoadProgress: function(percentAsDecimal){
if (percentAsDecimal > this.percentLoaded) {
this.percentLoaded = percentAsDecimal;
this.updateLoadProgress();
}
},
updateLoadProgress: function(){
if (this.controls.style.display == 'none') return;
this.loadProgress.style.width = (this.percentLoaded * (_V_.getComputedStyleValue(this.progressHolder, "width").replace("px", ""))) + "px";
},
// React to clicks on the play/pause button
onPlayControlClick: function(event){
if (this.video.paused) {
this.video.play();
} else {
this.video.pause();
}
},
// Adjust the play position when the user drags on the progress bar
onProgressHolderMouseDown: function(event){
this.stopTrackingPlayProgress();
if (this.video.paused) {
this.videoWasPlaying = false;
} else {
this.videoWasPlaying = true;
this.video.pause();
}
_V_.blockTextSelection();
document.onmousemove = function(event) {
this.setPlayProgressWithEvent(event);
}.context(this);
document.onmouseup = function(event) {
_V_.unblockTextSelection();
document.onmousemove = null;
document.onmouseup = null;
if (this.videoWasPlaying) {
this.video.play();
this.trackPlayProgress();
}
}.context(this);
},
// When the user stops dragging on the progress bar, update play position
// Backup for when the user only clicks and doesn't drag
onProgressHolderMouseUp: function(event){
this.setPlayProgressWithEvent(event);
},
// Adjust the volume when the user drags on the volume control
onVolumeControlMouseDown: function(event){
_V_.blockTextSelection();
document.onmousemove = function(event) {
this.setVolumeWithEvent(event);
}.context(this);
document.onmouseup = function() {
_V_.unblockTextSelection();
document.onmousemove = null;
document.onmouseup = null;
}.context(this);
},
// When the user stops dragging, set a new volume
// Backup for when the user only clicks and doesn't drag
onVolumeControlMouseUp: function(event){
this.setVolumeWithEvent(event);
},
// When the user clicks on the fullscreen button, update fullscreen setting
onFullscreenControlClick: function(event){
if (!this.videoIsFullScreen) {
this.fullscreenOn();
} else {
this.fullscreenOff();
}
},
onVideoMouseMove: function(event){
this.showController();
clearInterval(this.mouseMoveTimeout);
this.mouseMoveTimeout = setTimeout(function(){ this.hideController(); }.context(this), 4000);
},
onVideoMouseOut: function(event){
// Prevent flicker by making sure mouse hasn't left the video
var parent = event.relatedTarget;
while (parent && parent !== this.video && parent !== this.controls) {
parent = parent.parentNode;
}
if (parent !== this.video && parent !== this.controls) {
this.hideController();
}
},
// Adjust the width of the progress bar to fill the controls width
sizeProgressBar: function(){
// this.progressControl.style.width =
// this.controls.offsetWidth
// - this.playControl.offsetWidth
// - this.volumeControl.offsetWidth
// - this.timeControl.offsetWidth
// - this.fullscreenControl.offsetWidth
// - (this.getControlsPadding() * 6)
// - this.getControlBorderAdjustment()
// + "px";
// this.progressHolder.style.width = (this.progressControl.offsetWidth - (this.timeControl.offsetWidth + 20)) + "px";
this.updatePlayProgress();
this.updateLoadProgress();
},
// Get the space between controls. For more flexible styling.
getControlsPadding: function(){
return _V_.findPosX(this.playControl) - _V_.findPosX(this.controls)
},
// When dynamically placing controls, if there are borders on the controls, it can break to a new line.
getControlBorderAdjustment: function(){
var leftBorder = parseInt(_V_.getComputedStyleValue(this.playControl, "border-left-width").replace("px", ""));
var rightBorder = parseInt(_V_.getComputedStyleValue(this.playControl, "border-right-width").replace("px", ""));
return leftBorder + rightBorder;
},
// Track & display the current play progress
trackPlayProgress: function(){
this.playProgressInterval = setInterval(function(){ this.updatePlayProgress(); }.context(this), 33);
},
// Turn off play progress tracking (when paused)
stopTrackingPlayProgress: function(){
clearInterval(this.playProgressInterval);
},
// Ajust the play progress bar's width based on the current play time
updatePlayProgress: function(){
if (this.controls.style.display == 'none') return;
this.playProgress.style.width = ((this.video.currentTime / this.video.duration) * (_V_.getComputedStyleValue(this.progressHolder, "width").replace("px", ""))) + "px";
this.updateTimeDisplay();
},
// Update the play position based on where the user clicked on the progresss bar
setPlayProgress: function(newProgress){
this.video.currentTime = newProgress * this.video.duration;
this.playProgress.style.width = newProgress * (_V_.getComputedStyleValue(this.progressHolder, "width").replace("px", "")) + "px";
this.updateTimeDisplay();
},
setPlayProgressWithEvent: function(event){
var newProgress = _V_.getRelativePosition(event.pageX, this.progressHolder);
this.setPlayProgress(newProgress);
},
// Update the displayed time (00:00)
updateTimeDisplay: function(){
this.currentTimeDisplay.innerHTML = _V_.formatTime(this.video.currentTime);
if (this.video.duration) this.durationDisplay.innerHTML = _V_.formatTime(this.video.duration);
},
// Set a new volume based on where the user clicked on the volume control
setVolume: function(newVol){
this.video.volume = parseFloat(newVol);
localStorage.volume = this.video.volume;
},
setVolumeWithEvent: function(event){
var newVol = _V_.getRelativePosition(event.pageX, this.volumeControl.children[0]);
this.setVolume(newVol);
},
// Update the volume control display
// Unique to these default controls. Uses borders to create the look of bars.
updateVolumeDisplay: function(){
var volNum = Math.ceil(this.video.volume * 6);
for(var i=0; i<6; i++) {
if (i < volNum) {
_V_.addClass(this.volumeDisplay.children[i], "vjs-volume-level-on")
} else {
_V_.removeClass(this.volumeDisplay.children[i], "vjs-volume-level-on");
}
}
},
// Turn on fullscreen (window) mode
// Real fullscreen isn't available in browsers quite yet.
fullscreenOn: function(){
if (!this.nativeFullscreenOn()) {
this.videoIsFullScreen = true;
// Storing original doc overflow value to return to when fullscreen is off
this.docOrigOverflow = document.documentElement.style.overflow;
// Add listener for esc key to exit fullscreen
document.addEventListener("keydown", this.onEscKey, false);
// Add listener for a window resize
window.addEventListener("resize", this.onWindowResize, false);
// Hide any scroll bars
document.documentElement.style.overflow = 'hidden';
// Apply fullscreen styles
_V_.addClass(this.box, "vjs-fullscreen");
// Resize the controller and poster
this.positionController();
this.positionPoster();
}
},
nativeFullscreenOn: function(){
if(typeof this.video.webkitEnterFullScreen == 'function' && false) {
// Seems to be broken in Chromium/Chrome
if (!navigator.userAgent.match("Chrome")) {
this.video.webkitEnterFullScreen();
return true;
}
}
},
// Turn off fullscreen (window) mode
fullscreenOff: function(){
this.videoIsFullScreen = false;
document.removeEventListener("keydown", this.onEscKey, false);
window.removeEventListener("resize", this.onWindowResize, false);
// Unhide scroll bars.
document.documentElement.style.overflow = this.docOrigOverflow;
// Remove fullscreen styles
_V_.removeClass(this.box, "vjs-fullscreen");
// Resize to original settings
this.positionController();
this.positionPoster();
},
flashVersionSupported: function(){
return VideoJS.getFlashVersion() >= this.options.flashVersion;
}
})
// Convenience Functions (mini library)
// Functions not specific to video or VideoJS and could be replaced with a library like jQuery
var _V_ = {
addClass: function(element, classToAdd){
if (element.className.split(/\s+/).lastIndexOf(classToAdd) == -1) element.className = element.className == "" ? classToAdd : element.className + " " + classToAdd;
},
removeClass: function(element, classToRemove){
if (element.className.indexOf(classToRemove) == -1) return;
var classNames = element.className.split(/\s+/);
classNames.splice(classNames.lastIndexOf(classToRemove),1);
element.className = classNames.join(" ");
},
merge: function(obj1, obj2){
for(attrname in obj2){obj1[attrname]=obj2[attrname];} return obj1;
},
createElement: function(tagName, attributes){
return _V_.merge(document.createElement(tagName), attributes);
},
// Attempt to block the ability to select text while dragging controls
blockTextSelection: function(){
document.body.focus();
document.onselectstart = function () { return false; };
},
// Turn off text selection blocking
unblockTextSelection: function(){
document.onselectstart = function () { return true; };
},
// Return seconds as MM:SS
formatTime: function(seconds) {
seconds = Math.round(seconds);
minutes = Math.floor(seconds / 60);
minutes = (minutes >= 10) ? minutes : "0" + minutes;
seconds = Math.floor(seconds % 60);
seconds = (seconds >= 10) ? seconds : "0" + seconds;
return minutes + ":" + seconds;
},
// Return the relative horizonal position of an event as a value from 0-1
getRelativePosition: function(x, relativeElement){
return Math.max(0, Math.min(1, (x - _V_.findPosX(relativeElement)) / relativeElement.offsetWidth));
},
// Get an objects position on the page
findPosX: function(obj) {
var curleft = obj.offsetLeft;
while(obj = obj.offsetParent) {
curleft += obj.offsetLeft;
}
return curleft;
},
getComputedStyleValue: function(element, style){
return window.getComputedStyle(element, null).getPropertyValue(style);
}
}
// Class Methods
// Add video-js to any video tag with the class
VideoJS.setup = function(options){
var elements = document.getElementsByTagName("video");
for (var i=0,j=elements.length; i<j; i++) {
videoTag = elements[i];
if (videoTag.className.indexOf("video-js") != -1) {
options = (options) ? _V_.merge(options, { num: i }) : options;
videoJSPlayers[i] = new VideoJS(videoTag, options);
}
}
}
// Check if the browser supports video.
VideoJS.browserSupportsVideo = function() {
if (typeof VideoJS.videoSupport != "undefined") return VideoJS.videoSupport;
return VideoJS.videoSupport = !!document.createElement('video').canPlayType;
}
VideoJS.getFlashVersion = function(){
// Cache Version
if (typeof VideoJS.flashVersion != "undefined") return VideoJS.flashVersion;
var version = 0;
if (typeof navigator.plugins != "undefined" && typeof navigator.plugins["Shockwave Flash"] == "object") {
desc = navigator.plugins["Shockwave Flash"].description;
if (desc && !(typeof navigator.mimeTypes != "undefined" && navigator.mimeTypes["application/x-shockwave-flash"] && !navigator.mimeTypes["application/x-shockwave-flash"].enabledPlugin)) {
version = parseInt(desc.match(/^.*\s+([^\s]+)\.[^\s]+\s+[^\s]+$/)[1]);
}
} else if (typeof window.ActiveXObject != "undefined") {
try {
var testObject = new ActiveXObject("ShockwaveFlash.ShockwaveFlash");
if (testObject) {
version = parseInt(testObject.GetVariable("$version").match(/^[^\s]+\s(\d+)/)[1]);
}
}
catch(e) {}
}
return VideoJS.flashVersion = version;
}
VideoJS.isIE = function(){ return !+"\v1"; }
VideoJS.isIpad = function(){ return navigator.userAgent.match(/iPad/i) != null; }
// Allows for binding context to functions
// when using in event listeners and timeouts
Function.prototype.context = function(obj) {
var method = this
temp = function() {
return method.apply(obj, arguments)
}
return temp
}
//]]>
</script>
]]></b:skin>
<style type="text/css">
/* REQUIRED STYLES (be careful overriding)
================================================================================ */
/* Box containing video, controls, and download links.
If you want to add some kind of frame, use another containing element, not this one. */
.video-js-box { text-align: left; position: relative; } /* Will be set to the width of the video element */
/* Video Element */
video.video-js { background-color: #000; position: relative; }
/* Fullscreen styles for main elements */
.video-js-box.vjs-fullscreen { position: fixed; left: 0; top: 0; right: 0; bottom: 0; overflow: hidden; z-index: 1000; }
.video-js-box.vjs-fullscreen video.video-js { position: absolute; top: 0; left: 0; width: 100%; height: 100%; z-index: 1001; }
.video-js-box.vjs-fullscreen .vjs-controls { z-index: 1002; }
/* Poster styles */
.vjs-poster { display: block; position: absolute; left: 0; top: 0; width: 100%; height: 100%; }
/* DEFAULT SKIN (override in another file)
================================================================================
Using all CSS to draw the controls. Images could be used if desired.
Instead of editing this file, I recommend creating your own skin CSS file to be included after this file,
so you can upgrade to newer versions easier. */
/* Controls Layout
Using a Holy Grail type method to allow the progress bar holder to expand into all available space,
but using abosolute positioning for individual controls. http://www.alistapart.com/articles/holygrail */
.vjs-controls {
list-style: none; position: absolute; margin: 0; border: none; opacity: 0.85; color: #fff;
display: none; /* Start hidden */
left: 0; right: 0; /* 100% width of video-js-box */
height: 35px; /* Including any margin you want above or below control items */
padding-left: 35px; /* Width of play button + margin */
padding-right: 165px; /* Width of all the controls to the right of the progress control + margins */
}
/* Controls styles when below the video */
.video-js-box.vjs-controls-below .vjs-controls { background-color: #000; }
.vjs-controls > li { /* Direct li children of control bar */
position: absolute; list-style: none; float: left; padding: 0; text-align: center;
height: 25px; /* Default height of individual controls */
margin: 5px 0 0 0; /* Top margin to put space between video and controls when controls are below */
/* CSS Background Gradients */
/* Default */ background-color: #0B151A;
/* Webkit */ background: #1F3744 -webkit-gradient(linear, left top, left bottom, from(#0B151A), to(#1F3744)) left 12px;
/* Firefox */ background: #1F3744 -moz-linear-gradient(top, #0B151A, #1F3744) left 12px;
/* CSS Curved Corners */
border-radius: 5px; -webkit-border-radius: 5px; -moz-border-radius: 5px;
/* CSS Shadows */
box-shadow: 1px 1px 2px #000; -webkit-box-shadow: 1px 1px 2px #000; -moz-box-shadow: 1px 1px 2px #000;
}
/* Placement of Control Items */
.vjs-controls > li.vjs-play-control { width: 25px; left: 5px; }
.vjs-controls > li.vjs-progress-control { width: 100%; position: relative; }
.vjs-controls > li.vjs-time-control { width: 75px; right: 90px; }
.vjs-controls > li.vjs-volume-control { width: 50px; right: 35px; }
.vjs-controls > li.vjs-fullscreen-control { width: 25px; right: 5px; }
/* Removing curves on progress control and time control to join them. */
.vjs-controls > li.vjs-progress-control {
border-top-right-radius: 0; -webkit-border-top-right-radius: 0; -moz-border-radius-topright: 0;
border-bottom-right-radius: 0; -webkit-border-bottom-right-radius: 0; -moz-border-radius-bottomright: 0;
}
.vjs-controls > li.vjs-time-control {
border-top-left-radius: 0; -webkit-border-top-left-radius: 0; -moz-border-radius-topleft: 0;
border-bottom-left-radius: 0; -webkit-border-bottom-left-radius: 0; -moz-border-radius-bottomleft: 0;
}
/* Play/Pause
-------------------------------------------------------------------------------- */
.vjs-play-control { cursor: pointer !important; }
.vjs-play-control span { display: block; font-size: 0; line-height: 0; }
.vjs-play-control.vjs-play span {
width: 0; height: 0; margin: 8px 0 0 8px;
/* Drawing the play triangle with borders - http://www.infimum.dk/HTML/slantinfo.html */
border-left: 10px solid #fff; /* Width & Color of play icon */
/* Height of play icon is total top & bottom border widths. Color is transparent. */
border-top: 5px solid rgba(0,0,0,0); border-bottom: 5px solid rgba(0,0,0,0);
}
.vjs-play-control.vjs-pause span {
width: 3px; height: 10px; margin: 8px auto 0;
/* Drawing the pause bars with borders */
border-top: 0px; border-left: 3px solid #fff; border-bottom: 0px; border-right: 3px solid #fff;
}
/* Progress
-------------------------------------------------------------------------------- */
.vjs-progress-holder { /* Box containing play and load progresses */
position: relative; list-style: none; padding: 0; overflow:hidden; cursor: pointer !important;
height: 9px; border: 1px solid #777;
margin: 7px 1px 0 5px; /* Placement within the progress control item */
border-radius: 5px; -webkit-border-radius: 5px; -moz-border-radius: 5px;
}
.vjs-progress-holder li { /* Progress Bars */
position: absolute; display: block; width: 0; height: 9px;
border-radius: 5px; -webkit-border-radius: 5px; -moz-border-radius: 5px;
}
.vjs-play-progress {
/* Default */ background: #fff;
/* Webkit */ background: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#777));
/* Firefox */ background: -moz-linear-gradient(top, #fff, #777);
}
.vjs-load-progress {
opacity: 0.8;
/* Default */ background-color: #555;
/* Webkit */ background: -webkit-gradient(linear, left top, left bottom, from(#555), to(#aaa));
/* Firefox */ background: -moz-linear-gradient(top, #555, #aaa);
}
/* Time Display
-------------------------------------------------------------------------------- */
.vjs-controls .vjs-time-control { font-size: 10px; line-height: 1; font-weight: normal; font-family: Helvetica, Arial, sans-serif; }
.vjs-controls .vjs-time-control span { line-height: 25px; /* Centering vertically */ }
/* Volume
-------------------------------------------------------------------------------- */
.vjs-volume-control { cursor: pointer !important; }
.vjs-volume-control ul { list-style: none; display: block; margin: 0 5px 0 5px; padding: 4px 0 0 0; }
/* Drawing the volume icon using 6 li elements */
.vjs-volume-control ul li { /* Individual volume bars */
list-style: none; float: left; padding: 0;
margin: 0 2px 0 0; /* Space between */
width: 5px; height: 0px; /* Total height is height + bottom border */
border-bottom: 18px solid #555; /* Default (off) color and height of visible portion */
}
.vjs-volume-control ul li.vjs-volume-level-on { border-color: #fff; /* Volume on bar color */ }
/* Creating differnt bar heights through height (transparent) and bottom border (visible). */
.vjs-volume-control ul li:nth-child(1) { border-bottom-width: 2px; height: 16px; }
.vjs-volume-control ul li:nth-child(2) { border-bottom-width: 4px; height: 14px; }
.vjs-volume-control ul li:nth-child(3) { border-bottom-width: 7px; height: 11px; }
.vjs-volume-control ul li:nth-child(4) { border-bottom-width: 10px; height: 8px; }
.vjs-volume-control ul li:nth-child(5) { border-bottom-width: 14px; height: 4px; }
.vjs-volume-control ul li:nth-child(6) { margin-right: 0; }
/* Fullscreen
-------------------------------------------------------------------------------- */
.vjs-fullscreen-control { cursor: pointer !important; }
.vjs-fullscreen-control ul {
list-style: none; padding: 0; text-align: left; vertical-align: top; cursor: pointer !important;
margin: 5px 0 0 5px; /* Placement within the fullscreen control item */
width: 20px; height: 20px;
}
/* Drawing the fullscreen icon using 4 li elements */
.vjs-fullscreen-control ul li { list-style: none; float: left; margin: 0; padding: 0; font-size: 0; line-height: 0; width: 0; text-align: left; vertical-align: top; }
.vjs-fullscreen-control ul li:nth-child(1) { /* Top-left triangle */
margin-right: 3px; /* Space between top-left and top-right */
margin-bottom: 3px; /* Space between top-left and bottom-left */
border-top: 6px solid #fff; /* Height and color */
border-right: 6px solid rgba(0,0,0,0); /* Width */
}
.vjs-fullscreen-control ul li:nth-child(2) { border-top: 6px solid #fff; border-left: 6px solid rgba(0,0,0,0); }
.vjs-fullscreen-control ul li:nth-child(3) { clear: both; margin: 0 3px 0 0; border-bottom: 6px solid #fff; border-right: 6px solid rgba(0,0,0,0); }
.vjs-fullscreen-control ul li:nth-child(4) { border-bottom: 6px solid #fff; border-left: 6px solid rgba(0,0,0,0); }
/* Icon when video is in fullscreen mode */
.vjs-fullscreen .vjs-fullscreen-control ul li:nth-child(1) { border: none; border-bottom: 6px solid #fff; border-left: 6px solid rgba(0,0,0,0); }
.vjs-fullscreen .vjs-fullscreen-control ul li:nth-child(2) { border: none; border-bottom: 6px solid #fff; border-right: 6px solid rgba(0,0,0,0); }
.vjs-fullscreen .vjs-fullscreen-control ul li:nth-child(3) { border: none; border-top: 6px solid #fff; border-left: 6px solid rgba(0,0,0,0); }
.vjs-fullscreen .vjs-fullscreen-control ul li:nth-child(4) { border: none; border-top: 6px solid #fff; border-right: 6px solid rgba(0,0,0,0); }
/* Download Links - Used for browsers that don't support any video.
-------------------------------------------------------------------------------- */
.vjs-no-video { font-size: small; }
</style>
شرح كيفية الإستخدام
قم بكتابة تدوينتك بالطريقة المعتادة
و عندما تأتي للسطر الذي سوف تريد وضع فيه هته الخاصية,
<div dir="rtl" style="text-align: right;" trbidi="on">
<div class="video-js-box">
<div style="text-align: center;">
<video class="video-js" controls="controls" height="264" poster="http://video-js.zencoder.com/oceans-clip.png" preload="" width="540">
<source src="http://video-js.zencoder.com/oceans-clip.webm" type="video/webm; codecs="vp8, vorbis""></source>
</video></div>
</div>
</div>
|
-
مشكور استاذ خالد اضافه متحمس لها جداااا
لكن للاسف تعطيني خطا عند التطبيق
-
العفو اخواني..
الأخ توك شو
بما ان الخطا عند التطبيق فحتما المشكلة تتعلق في كود ال HTML
كن متاكد انك قمت بتحويل رابط اليوتيب الى رابط اخر في هدا الموقع
http://tinyvid.tv/upload
و لا تنسى اخي الكريم تحويل الرابط الموجود في الموضوع
http://video-js.zencoder.com/oceans-clip
الى رابط اللدي اعطاه لك الموقع بعد التحويل
و هته صورة توضيحية
http://img190.imageshack.us/img190/6909/1607201003215.png
تحياتي لكل من مر هنا !
-
بعتذر لاني لم اوضح لك المشكله بالظبط
الخطا يظهر في القلب عندي عندما اضع الاكواد اللتي وضعتها في الشرح
رغم اني نفذت الشرح كما قدمته انت مشكورا
-
أخي انا جد متأكد من الاكواد..ربما لم تنسخ الأكواد بشكل جيد
أنا أنصحك بنسخ الكود ابتداءاا من الأسفل من الجهة اليسرى
حاول اخي و بانتضار جديدك
و ان لم تنجح فيمكنك مراسلتي مع ارفاق قالبك و ساقوم انا بالتعديل
تحياتي
مآشآءاالله شرح كافي ووافي