أحمد حبنكة
الأعضاء-
المساهمات
338 -
تاريخ الانضمام
-
تاريخ آخر زيارة
نوع المحتوى
ريادة الأعمال
البرمجة
التصميم
DevOps
التسويق والمبيعات
العمل الحر
البرامج والتطبيقات
آخر التحديثات
قصص نجاح
أسئلة وأجوبة
كتب
دورات
كل منشورات العضو أحمد حبنكة
-
الحل يعتمد على استخدام onended event وهو الحدث الذي ينفذ عندما ينتهي الفيديو، نفترض مثلاً أن تضم الفيديو هكذا: <video id="myvideo" src="path/to/video" onended="myFunction()"></video> عندها لإخفاء الفيديو نعرف myFunction هكذا: function myFunction(){ const videoElement = document.getElementById("myVideo"); videoElement.style.display = 'none'; } وبهذه الطريقة سيختفي الفيديو عندما ينتهي. لاحظ أننا نخفي الفيديو كما نخفي أي عنصر html عادي وهناك طرق أخرى ﻹخفاء عناصر html ولكن display: none هو ما نريده في معظم اﻷحيان وهو أسرع وأسهل من حذف العنصر من شجرة html.
-
يتوقف ذلك على مدى ارتباط ميزات كل موقع بالمواقع اﻷخرى مثلاً دمج موقع ألعاب مع موقع عقارات أمر خاطئ بكل تأكيد. أنت تقول بأن المواقع لها مجالات مختلفة فلماذا تريد دمجها ؟
- 4 اجابة
-
- 1
-
أولاً ماذا تعني بدمج خمسة مواقع ؟ أتعني توحيد الكود بطريقة تنتج هذه المواقع الخمسة فقط بتغيير configuration معين ؟ أم تقصد التكامل بين قواعد بياناتها مثل التكامل بين تطبيقات ERP ؟ أياً كان ما تعنيه فذلك بالطبع يتوقف على هذه المواقع ما اللغة التي استخدمت ﻹنشائها وما بيئة العمل ؟ وكذلك هل المجالات المختلفة مرتبطة بشكل ما أم لا ؟ أرجو إجابتي على أسئلتي حتى أجيبك.
-
يتوقف ذلك على التقنيات التي تستخدمها في بناء الموقع ولكن الفكرة العامة هي استخدام مكتبات من أجل ذلك، مثلاً إن كنت تستعمل jquery فلدينا مكتبة dropzone.js ورابطها في هذا الموقع: https://www.dropzonejs.com/ مثال على المكتبة السابقة: <form action="/file-upload" class="dropzone"> <div class="fallback"> <input name="file" type="file" multiple /> </div> </form> ستقوم المكتبة بشكل أوتوماتيكي بوضع مكان ﻹسقاط الملفات على form السابق وinput موجود فقط للمتصفحات التي لا تدعم اﻹسقاط. إذا كنت تستعمل ReactJS هناك مكتبة react-dropzone وهكذا. إن كنت تريد معرفة كيف تعمل هذه المكتبات فهي تستعمل ما يسمى HTML Drag and Drop API وهي ميزة للـHTML لن أتطرق لشرحها هنا يمكنك القراءة عنها في موقع w3schools هنا: https://www.w3schools.com/html/html5_draganddrop.asp
- 2 اجابة
-
- 1
-
<div id="wrapper"> المشكلة تكمن في هذا السطر: <div id="wrapper" class="toggled"> الصف toggled عندما يكون موجوداً يكون sidebar ظاهراً وعندما لا يكون يختفي sidebar ، هذا تم تحقيقه بالـCSS ومن خلال الجافاسكريبت نضيف هذا الصف أو نزيله عند الضغط على زر navigation. عند تحميل الصفحة المستعرض سيجد الصف toggled مطبقاً على wrapper div والذي يعني إظهار sidebar، كل ما عليك فعله ﻹخفائه عند تحميل الصفحة حيث لا يظهر إلا بالضغط على زر navigation هو تغيير السطر أعلاه إلى: <div id="wrapper"> بالمناسبة وجدت أخطاءً في كودك ليس لها علاقة بمشكلتك ولكن للنصيحة فقط: 1- أنت تضم مكتبتي jquery وbootstrap.min.js مرتين مرة من CDN ومرة من مجلد js ، إكتف بإحداهما ولا تنس وضع jquery قبل bootstrap.min.js ﻷن الـbootstrap يستخدم jquery. 2- كود الـcss دمج به الـbootstrap وكودك الخاص، لا داعي لدمج كود الـbootstrap بكود CSS أبداً. 3- آخر نسخة للـbootstrap هي 4.5.3 والنسخة التي تستعملها قديمة 4- يمكنك ضم نسخة rtl من bootstrap دون اللجوء لدمجه داخل كودك تماماً كما تضم أي ملف CSS من CDN أو مجلد وللعلم تجد نسخة bootstrap-rtl هنا https://github.com/MahdiMajidzadeh/bootstrap-v4-rtl ، عندما يصير bootstrap 5 مستقراً لن تحتاج إلى bootstrap-rtl ﻷن فريق bootstrap الفريد سيدعم RTL. 5- أين عنصر head ؟!!! وأين body ؟!!!
- 4 اجابة
-
- 1
-
يبدو أنك تستعمل الماك ويبدو أنك لم تقم بتنصيب scriptcs، لفعل ذلك قم بتنفيذ اﻷمر التالي: brew install scriptcs هذا اﻷمر يستخدم Homebrew الذي أرجو أن تكون قد نصبته على جهازك. إذا أعطاك اﻷمر أعلاه شيئاً مثل command not found: brew فذلك يعني أنك لم تنصب Homebrew ولكن تنصيبه سهلٌ باﻷمر التالي: /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" بعد تنصيب Homebrew نفذ اﻷمر: brew install scriptcs بالطبع أنا أفترض أنك تقود باستخدام scriptcs ﻷنك لا تريد تنصيب visual studio ولكن إن أردت العمل على مشاريع كبيرة فأنا أنصح بصراحة استخدام visual studio for mac ، نعم هناك نسخة visual studio مخصصة للماك وليس محصوراً بالويندوز إن كنت تعتقد ذلك.
-
هل يمكنك مشاركتنا برسالة الخطأ ؟ ﻷن الكود الذي نشرته لا يبدو أن فيه أي خطأ.
-
الهدف من الـwebpack هو أن تقسم الملفات كيفما تشاء، تريد كتابة كل شيء في index.js ؟ يمكنك ذلك، تريد فصله إلى ملف آخر ؟ يمكنك ذلك وحينها تقوم بـimport لهذا الملف من الـindex.js هكذا: import {func1} from "./script.js" حيث script.js موجودة في نفس مجلد index.js معرفة هكذا: export function func1(){ // code } لاحظ تعليمة export وهي تجعل استخدام func1 خارج ملف script.js ممكناً، يمكنك تعريف توابع من دون export وحينها تكون private فقط ملف script.js يستطيع استخدامها. يمكنك أيضاً وضع script.js داخل مجلد مثلاً util وعندها يكون الكود في index.js هكذا: import {func1} from "./util/script.js" بالطبع يمكن لـscript.js أن يقوم بعملية import هو اﻵخر. ما يفعله الـwebpack هو تتبع كل عمليات import من index.js ليصل إلى قائمة ملفات، هذه الملفات قد تقوم بعملية import أيضاً والـwebpack يقوم بتتبعها حتى نصل إلى شجرة ملفات، بعدها بشكل افتراضي يقوم webpack بتجميعها إلى ملف واحد يمكن ضمه بسهولة إلى ملف html بالطريقة المعروفة. بالطبع الـwebpack مقدراته أكبر من ذلك بكثير ﻷنه يقوم بعمل minification للكود كما يقوم بحذف التوابع الغير مستخدمة لسبب ما وأمور أخرى كثيرة. بصراحة مقدراته تستحق كتاباً بحد ذاته.
- 1 جواب
-
- 1
-
أتريدين ضبط ارتفاع وعرض background image للـcontainer ؟
- 4 اجابة
-
- 1
-
أولاً الكلاس: public enum Color{ RED, WHITE, BLUE } public class Car { private int speed; private String model; private Color color; public int getSpeed(){ return speed; } public void setSpeed(int speed){ this.speed = speed; } public String getModel(){ return model; } public void setModel(String model){ this.model = model; } public Color getColor(){ return color; } public void setColor(Color color){ this.color = color; } } لاحظ أننا استخدمنا enum للون وذلك ﻷن ألوان السيارات تكون إحدى قيم محدودة، كل خاصية للكلاس عبارة عن private field مع getter/setter وهذا عرف منصوح به في الجافا. اﻵن لإنشاء array من الكلاس أعلاه: Car[] cars = new Car[2]; cars[0] = new Car(); cars[0].setColor(Color.RED); cars[0].setModel("Mercedes"); cars[0].setSpeed(240); cars[1] = new Car(); cars[1].setColor(Color.BLUE); cars[1].setModel("BMW"); cars[1].setSpeed(260); طبعاً يمكنك إنشاء مصفوفة بأي حجم تريد، لاحظ أن بناء مصفوفة من Car يتمضن خطوتين: أولاً إنشاء المصفوفة، بعد هذه الخطوة يتشكل لدينا مصفوفة بحجم معين كل قيمها عبارة عن null أي أننا لم ننشئ بعد أي Car object. الخطوة الثانية تكون ملء المصفوفة بـCar objects، طبعاً يمكننا ترك بعض قيم المصفوفة null إن شئنا ذلك وهذا يتبع لمنطق البرنامج الذي نريده.
- 2 اجابة
-
- 1
-
هناك عدة مشاكل في كود controller. أولاً لم تابع edit هو private ؟ يجب أن يكون public ﻷنه action. ثانياً يجب فصل كود التعديل على قاعدة البيانات عن كود إظهار فورم التعديل هكذا: class ArticlesController < ApplicationController def index @articles = Article.all end def show @article = Article.find(params[:id]) end def new @article = Article.new end def create #render plain: params[:article].inspect @article = Article.new(article_params) if @article.save redirect_to @article else render 'new' end end def update if @article.update(article_params) redirect_to @article else render 'edit' end end def edit @article = Article.find(params[:id]) end private def article_params params.require(:article).permit(:title, :text) end end
- 2 اجابة
-
- 1
-
أولاً التعليمة فيها خطأ إذ يجب أن تكون: orderRange = Array.from(Array(blocks.length).keys()) وذلك ﻷن keys تابع وليس property. واﻵن لنشرح تابع keys هذا بمثال، ضع هذه التعليمة في browser console : const a = [1,2,3].keys() اﻵن ضع a ليطبع لك المتصفح قيمته، سيطبع لك المتصفح : Array Iterator {} ما هذا ؟ iterator هو ميزة جديدة في ES6 وهو عبارة عن object له method اسمه next باستدعاء هذا الـmethod تتولد قيمة جديدة حسب تعريف iterator ومعها متحول بولياني done والذي يخبرك هل هناك قيم جديدة يمكن توليدها أم لم يعد هناك. دعنا نوضح هذا الـnext في مثالنا، نفذ التعليمة التالية: a.next() سيطبع لك المتصفح: {value: 0, done: false} نفذها مرةً أخرى وسيطبع لك: {value: 1, done: false} ومرةً أخرى: {value: 2, done: false} ومرة أخيرة: {value: undefined, done: true} لاحظ أن done صارت true مما يعني أنه لا توجد أي قيم جديدة، لاحظ أن القيم هي 0,1,2 وهي عبارة عن القيم من 0 إلى طول المصفوفة - 1. وأيضاً كان يمكننا بدلاً من استدعاء next عدة مرات أن نستخدم for-of، نفذ تعليمة for هذه لتعلم ما أقصد: for(const k of [1,2,3].keys()){ console.log(k); } أما تابع Array.from فهو يحول أي iterator object إلى مصفوفة. تعليمتك بالنتيجة ما هي إلى إنشاء مصفوفة قيمها من 0 إلى blocks.length - 1 فقط لا غير. بالطبع iterator object ليس بالضرورة يولد قيماً من 0 إلى طول مصفوفة ما بل يمكنه توليد أي قيم ﻷي عدد من المرات وبعض iterator object تكون حتى لا نهائية أي done دائماً false ، ما يحدد ماذا يولد iterator object هو التابع الذي تستدعيه، في مثالك array.keys() يولد قيم من 0 إلى طول المصفوفة -1 أما في المثال التالي: const s = new Set([1,5,3]).keys() فالـiterator object سيولد 1,5,3.
- 4 اجابة
-
- 4
-
لا بد أن تعطينا الكود يا صديقي حتى نجيبك، بالتحديد أين تستدعي session_start ؟
-
السؤال عبارة عن ثلاث خطوات، الخطوة اﻷولى إنشاء قاعدة البيانات والتعليمة هي CREATE DATABASE UNIVERSITY الخطوة الثانية عبارة عن تعليمة CREATE TABLE أعمدته موضحة في السؤال، لدينا أعمدة عادية مثل Student_Name وعمودان عليهما constraint اﻷول عمود Student_Id وهو primary key واﻵخر عمود Department_No وهو Foreign Key. لمعرفة كيفية كتابة تعليمة إنشاء جدول أنظري للرابط: https://www.w3schools.com/sql/sql_create_table.asp لمعرفة كيفية تحديد عمود Primary Key انظري الرابط : https://www.w3schools.com/sql/sql_primarykey.ASP لمعرفة كيفية إنشاء عمود Foreign Key انظري الرابط: https://www.w3schools.com/sql/sql_foreignkey.asp ملاحظة: يبدو أن عمود Birth_Date هو في الحقيقة unix timestamp عن تاريخ الولادة، يمكنك تحويل أي تاريخ ووقت إلى unix timestamp من الموقع التالي: https://www.unixtimestamp.com/index.php باستخدام الروابط السابقة تكون التعليمة المطلوبة: CREATE TABLE STUDENT (Student_Name varchar(50), Student_ID int(10) NOT NULL, Birth_Date int(10), Address varchar(50), Department_No int(5), PRIMARY KEY (Student_ID), FOREIGN KEY (Department_No) REFERENCES Department(department_id) ); التعليمة السابقة ستعمل فقط على mysql، إن كنت تستعملين SQL Server فالتعليمة هي: CREATE TABLE STUDENT (Student_Name varchar(50), Student_ID int(10) NOT NULL PRIMARY KEY, Birth_Date int(10), Address varchar(50), Department_No int(5) FOREIGN KEY REFERENCES Department(department_id) ); ربما لاحظت أننا وضعنا NOT NULL على Student_ID وذلك لأن المفتاح الرئيسي لا يجوز أن يكون null. الخطوة الثالثة هي تعليمة INSERT على الجدول المنشأ مثلاً: INSERT INTO Student(Student_Id,Student_Name,Birth_Date,Address,Department_No) VALUES (1,'ahmad',733795200,'',1) حيث ننتبه في المثال السابق على ضرورة وجود Department بالرقم 1 في جدول department. بالمناسبة هناك عدة قواعد بيانات تقبل إضافة عدة أسطر(طلاب) في تعليمة واحدة هكذا: INSERT INTO Student(Student_Id,Student_Name,Birth_Date,Address,Department_No) VALUES (1,'ahmad',733795200,'',1), (2,'batool',736387200,'',1)
- 3 اجابة
-
- 1
-
لديك مشكلة في تعليمة sql التي ترسلها: INSERT INTO xuser(UserName,Email,xPassWord,ConfirmPassword); VALUES('$UserName','$Email','$xPassWord','$ConfirmPassword') لاحظ أنك تضع ; بعد تعليمة INSERT قبل VALUES وهذا خطأ سيعطي بالتأكيد SYNTAX ERROR أو ما شابه، التعليمة الصحيحة: INSERT INTO xuser(UserName,Email,xPassWord,ConfirmPassword) VALUES('$UserName','$Email','$xPassWord','$ConfirmPassword') نصيحتي للمستقبل: للتأكد من صحة أي تعليمة sql ترسلها من php قم بنسخ التعليمة إلى phpmyadmin واستبدل متحولات php بقيم من عندك ونفذ تعليمة sql ، أي خطأ سيظهر هناك بكل تأكيد. بالمناسبة هناك ملف مضمن هنا: include('C:\xampp\htdocs\Artree/connect.php'); أين كود connect.php ؟ ثم لا أنصح باستخدام absolute path هنا بل relative path: include('connect.php'); حيث connect.php يكون بنفس مجلد registration.php، وحتى لو أردت استخدام absolute path فإما تستخدم / دائماً: include('C:/xampp/htdocs/Artree/connect.php'); أو تستخدم \ دائماً: include('C:\xampp\htdocs\Artree\connect.php'); واعلم أن windows يقبل / كفاصل أما سبب نصيحتي فتخيل رفع الموقع لسيرفر linux ماذا سيحدث ؟ أو سيرفر ويندوز لا يضع الموقع في C ؟
-
اعذرني يا صديقي ولكن لا أستطيع أن أحل لك الوظيفة، عليك أن تحلها بنفسك لتتعلم، على كل أستطيع مساعدتك إن قلت لنا فيم تعاني بالضبط وما الكود الذي كتبته حضرتك لتحلها.
-
الرابط الذي ذكرته هو الدليل الرسمي للRuby On Rails لذا بكل تأكيد هذا المرجع مفيد جداً. لكن انتبه هذا الدليل يفترض أنك قد تعلمت لغة البرمجةRuby لأن Ruby On Rails هي framework وليست لغة البرمجة
- 2 اجابة
-
- 1
-
العفو ولكن ماذا تعني بالويرد ؟
-
يمكنك أخي عماد أن تعرف السبب من الكود التالي: (function mainFunc(){ var i,c; function changeColor(color) { color= ["red","blue","black","yellow","white"]; for(i = 0 ; i<color.length ; i=i+1) c=color[i] ; } console.log(c); } return changeColor(); }()); هذا الكود سيطبع "white" فقط وذلك ﻷن قيمة c بعد أن تنتهي حلقة التكرار تساوي "white" وفي الكود الخاص بك ما هو داخل العنصر main سيكون "white". ولكن ماذا نفعل لطباعة جميع قيم المصفوفة ؟ المشكلة تكمن في أنك تريد طباعتها داخل عنصر HTML ، إذا أخبرتني بهدفك من ذلك قد نتوصل إلى حل وإلا عليك أن تجد طريقةً أخرى للطباعة. لست متأكداً تماماً مما تريد ولكن لعلك تحصل على ما تريد إن استبدلت هذه التعليمة: myMain.innerHTML=color[i] ; بهذه: myMain.innerHTML+=color[i] + " " ; // المسافة هي لفصل اﻷلوان المراد طباعتها، يمكنك اختيار ما تشاء للفصل بينها مثلاً <br />
- 5 اجابة
-
- 1
-
المعذرة منك أخي عماد ولكن ما الذي لا يعمل فيه بالضبط فقد جربته عندي ولا يبدو أن هناك أي خطأ به ؟
- 5 اجابة
-
- 1